如何反序列化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
相关产品推荐
相关产品推荐

