首页 > 解决方案 > 有什么方法可以在 .Net Framework 中复制 .Net Core DeflateStream.Flush() 行为?

问题描述

背景

我想在应用程序的未来 .Net Core 端口中使用StreamJsonRpc作为 WCF 的替代品。在将代码移植到 .Net Core 之前,我想更新现有代码(即 .Net Framework 4.8)以使用 StreamJsonRpc。

因为StreamJsonRpc写入的数据比二进制源数据大,而且压缩性极强,所以想用DeflateStream它来压缩。

这导致了问题:压缩适用于 .Net Core,但不适用于 .Net Framework。

为什么它不起作用

考虑以下代码:

var output   = new MemoryStream();
var deflater = new DeflateStream(output, CompressionMode.Compress, leaveOpen:true);
var data     = Encoding.UTF8.GetBytes("This is the data to be compressed");

deflater.Write(data, 0, data.Length);
deflater.Flush();

Console.WriteLine(output.Length); // 0 for .Net 4.8, >0 for .Net Core 3.1+

对于 .Net Core,这会输出一个大于零的数字。对于 .Net Framework,此输出为零。

我已经进行了检测StreamJsonRpc,我可以看到它Stream.Flush()在写入数据块后正在调用,所以我很确定这是问题所在。

.Net Core 实现DeflateStream.Flush()实际上会刷新,但 .Net Framework 实现什么也不做。

我的问题

.Net Framework 4.8 中有什么方法可以刷新DeflateStream吗?如果有,我可以DeflateStream为该实现编写一个包装类,Stream.Flush()以便它实际刷新。

其他注意事项

2015 年 10 月为此提出了一个错误,并于 2015年 12 月为 .Net Core 修复了该错误。

此外,文档DeflateStream.Flush()不正确。

对于 .Net Framework.Net Core,标头说:

此方法的当前实现没有功能。

但在备注下它说:

如果压缩模式设置为 Compress,则刷新内部缓冲区。

显然,这两件事都不正确,.Net Core 与 .Net Framework 的文档应该不同。

标签: c#deflatestream

解决方案


推荐阅读