微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有什么方法可以在 .Net Framework 中复制 .Net Core DeflateStream.Flush() 行为?

如何解决有什么方法可以在 .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 举报,一经查实,本站将立刻删除。