有什么方法可以在 .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,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(),所以我很确定这就是问题所在。

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

我的问题

.Net Framework 4.8 中有没有办法刷新 DeflateStream?如果有,我可以为实现 DeflateStreamStream.Flush() 编写一个包装类,以便它实际刷新。

其他注意事项

A bug was raised for this 于 2015 年 10 月,it was fixed for .Net Core 于 2015 年 12 月。

另外,the documentation for DeflateStream.Flush() 是不正确的。

对于 .Net Framework .Net Core,标题表示:

方法的当前实现没有功能

但是在备注下它说:

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

显然这两件事都不能成立,.Net Core 和 .Net Framework 的文档应该不同。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)