You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反序列化GZipStream?附REST云端存储场景序列化代码

反序列化GZip压缩流的解决方案

嘿,我来帮你搞定这个反序列化的问题!根据你给出的序列化逻辑——你是把一个源Stream通过GZip压缩后写入目标流,那反序列化的步骤正好是反过来的:先对存储的压缩流进行GZip解压缩,再把解压缩后的内容还原成原始的Stream对象。

下面是对应的反序列化代码实现:

public Stream Deserialize(Stream compressedStream)
{
    // 先确保压缩流的位置在开头,否则可能读不到内容
    compressedStream.Position = 0;
    
    using (GZipStream zipStream = new GZipStream(compressedStream, CompressionMode.Decompress, true))
    {
        // 创建一个MemoryStream来存放解压缩后的原始流内容
        MemoryStream originalStream = new MemoryStream();
        zipStream.CopyTo(originalStream);
        // 重置流的位置到开头,方便后续读取使用
        originalStream.Position = 0;
        return originalStream;
    }
}

关键细节说明:

  • GZipStream的模式:这里必须用CompressionMode.Decompress,和序列化时的Compress对应。
  • 流的位置处理:传入的compressedStream(也就是你序列化时写入的那个流)一定要确保Position在0的位置,否则解压缩会从当前位置开始读,可能丢失前面的压缩数据。
  • 返回独立的流:我们把解压缩后的内容复制到MemoryStream里返回,而不是直接返回GZipStream——因为GZipStream被包裹在using块里,一旦using结束它就会被释放,后续无法再读取。用MemoryStream可以保存解压缩后的完整内容,方便你后续使用。
  • 第三个参数true:和序列化时一样,我们把GZipStream的leaveOpen参数设为true,这样在GZipStream释放时不会关闭传入的compressedStream,你还可以继续操作这个原始的压缩流(比如重新读取或者关闭)。

如果你的场景里需要把解压缩后的流直接写入到另一个已存在的流(比如文件流),也可以简化代码,不用MemoryStream,直接把zipStream.CopyTo到目标流里:

public void DeserializeToStream(Stream compressedStream, Stream targetStream)
{
    compressedStream.Position = 0;
    using (GZipStream zipStream = new GZipStream(compressedStream, CompressionMode.Decompress, true))
    {
        zipStream.CopyTo(targetStream);
        // 如果targetStream支持Seek,记得重置位置
        if (targetStream.CanSeek)
        {
            targetStream.Position = 0;
        }
    }
}

这样就完美匹配你之前的序列化逻辑啦!

内容的提问来源于stack exchange,提问作者Md. Parwez Akhtar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:55:40