C# GZipStream无法正确解压缩数据

C# GZipStream无法正确解压缩数据,c#,gzip,C#,Gzip,我正在尝试用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.Comp

我正在尝试用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
是否无法解压缩自身压缩的流?还是我做错了什么?

来自以下文件:

此方法的当前实现不会刷新内部缓冲区。当对象被释放时,内部缓冲区被刷新

这与写入
ms2
的数据不足相适应。尝试使用
块在
中包装
zipStream

var ms2 = new MemoryStream();
using (GZipStream zipStream = new GZipStream(ms2, CompressionMode.Compress))
{
    ms.CopyTo(zipStream);
}

有趣。似乎异步版本
FlushAsync
确实清除了缓冲区。@Magnus真的吗?GZipStream没有实现FlushAsync,这意味着我们应该回到Stream的实现,它只在
任务中调用Flush。Run
@Magnus Aha,“适用于:.NET Core 3.0预览7”。我在看框架版本。看起来像