我正在尝试使用GZipStream压缩数据。代码非常简单:
// Serialize
var ms = new MemoryStream();
ProtoBuf.Serializer.Serialize(ms, result);
ms.Seek(0, SeekOrigin.Begin);
// Compress
var ms2 = new MemoryStream();
GZipStream zipStream = new GZipStream(ms2, CompressionMode.Compress);
ms.CopyTo(zipStream);
zipStream.Flush();
// Test
ms2.Seek(0, SeekOrigin.Begin);
var ms3 = new MemoryStream();
var unzipStream = new GZipStream(ms2, CompressionMode.Decompress);
unzipStream.CopyTo(ms3);
System.Diagnostics.Debug.WriteLine($"{ms.Length} =? {ms3.Length}");
结果应该相等,但是我得到了:
244480 =? 191481
GZipStream
是否无法解压缩自身压缩的流?还是我做错了什么?
答案 0 :(得分:2)
摘自GZipStream.Flush
的文档:
此方法的当前实现不刷新内部缓冲区。放置对象时,将清空内部缓冲区。
这适合于没有足够的数据写入ms2
。尝试将zipStream
包装在using
块中:
var ms2 = new MemoryStream();
using (GZipStream zipStream = new GZipStream(ms2, CompressionMode.Compress))
{
ms.CopyTo(zipStream);
}