.NET压缩库的推荐

24

除了使用GZipStream类,我正在寻找有关在.NET中压缩数据的一些建议。

我希望能快速高效地压缩字节数组以便通过TCP发送它们。


如果您不喜欢GZipStream,请解释原因/原因是什么会很有帮助。 - Matthew Flaschen
并不是说我不喜欢它 - 只是在寻找可能能提供更好性能和更高压缩比例的替代方案。商业库也可以。 - G-Man
5个回答

11
如果你需要对数据进行压缩,那么你可能会考虑使用高密度序列化而不是压缩。像 protobuf 这样的东西。这里有一些C# 的实现。对于已有的对象, 在我看来 protobuf-net 是最简单的实现方式(披露:我是作者 - 但它是免费的)。你只需要将其序列化到流中,或者如果你想要一个 byte[],则使用一个单独的 MemoryStream
对于连续使用(而非 HTTP 的离散请求 / 响应),建议查看Serializer.SerializeWithLengthPrefix / Serializer.DeserializeWithLengthPrefix 操作(protobuf 本身没有终止符,因此需要一个长度前缀来处理不同的消息)。

1
Marc,"高密度串行化"是什么意思,特别是与压缩相比?它是否利用任何压缩方案或者只是一种有效表示数据的方式?你能简要解释一下,或者给出任何阅读指引吗? - Dirk Vollmar
@0xA3 - 我的意思是:如果这是典型的应用程序数据(您可能会将其表示为 XML 或 JSON),则使用不同的序列化程序以较少的字节编写相同的数据。因此,不要编写 <AccountId>123</AccountId>,而是编写 2 或 3 个字节。但对于 任意 byte[] 不适用。 - Marc Gravell
@MarcGravell 如果有许多和/或大型字符串被序列化,那么怎么办?ProtoBuf是否压缩流式传输的字符串? - Kind Contributor
@Todd,不,protobuf规范没有提到压缩。在这种情况下我们所做的就是:对结果有效载荷进行gzip压缩。 - Marc Gravell

9

DotNetZip提供本地支持,具有非常友好的API,并且在我看来比SharpZipLib更灵活:

DotNetZip

编辑:不幸的是,DotNetZip存在一些重大问题,并且该项目似乎不再得到积极维护。因此,这个库无法真正推荐用于生产代码。

更好的选择是使用SharpZipLib(如果您遵守他们基于GPL的许可证),其中一个zlib的.NET端口或.NET 4.5的zip支持,如这个答案所示


我对DotNetZip有不好的经历,它无法打开其他库可以完美打开的Zip归档文件。由于某些原因,它会抛出OverflowException异常,这是我无法解决的问题。 - kungfooman
@lama12345:感谢您指出这一点。现在,我也非常清楚DotNetZip的问题,因为它们也困扰着我。我已经更新了我的答案。 - Dirk Vollmar
1
@Cheeso:DotNetZip 项目的未来有什么更新吗?有没有任何方式可以支持该项目? - Dirk Vollmar

4

SharpZipLib是一种替代方案。据说它比框架库GZipStream写得更加周到。


7
SharpZipLib已经不再维护且存在bug,最后一次更新是在2010年6月。尽管zip文件完全正常,但它有时会出现与7zip、ioniczip等软件制作的zip文件有问题的情况。我们在工作中使用它作为一个组件,不得不修复源代码并进行本地构建,这并不是什么大问题,但如果你正在寻找一个即插即用的zip库,这并不是你想要解决的问题。 - aggieNick02
@aggieNick02,你能上传修复后的源代码吗? - mafu
抱歉 @mafu - 我不再能够访问我们所做的更改。 - aggieNick02

1

现在,.NET 3+已经内置了Zip支持,使用ZipPackage类即可。


不幸的是,它只提供了某种类型的zip支持。它允许您创建基于zip的“包”,但这些包不是纯zip文件,而是由OpenPackaging Conventions(OPC格式)描述的包。这些包由PackagePart和PackageRelationship元素组成。这个格式可能最为人所知的是Office OpenXML格式使用的容器格式。 - Dirk Vollmar
IONIC 压缩库怎么样? - Munish Goyal

1

LZMA 被认为是最好的压缩算法之一。7-Zip 是 LZMA 的公共领域 SDK 实现,可以在此免费下载:

http://www.7-zip.org/sdk.html

压缩算法维基百科

7z的LZMA算法在除了像.wav和.bmp这样的“多媒体”文件之外,比RAR达到更高的压缩比,而RAR使用专门的例程胜过LZMA。其他免费的压缩软件,如NanoZip和FreeArc通常优于WinRAR。


1
我是7-zip的忠实粉丝,但不确定其API是否易于访问。 - James Westgate
2
该链接指向LZMA SDK,它具有C# API,并且是公共领域。 - code4life
遗憾的是,C# SDK已经10年没有更新了,不支持LZMA2。 - mafu
1
我想把这篇帖子删掉,但是我不想失去那10个积分,哈哈/叹气。 - code4life

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接