我在内存中有一个大对象,我想将它作为 blob 保存到数据库中。我想在保存之前对其进行压缩,因为数据库服务器通常不是本地的。
这就是我目前所拥有的:
using (var memoryStream = new MemoryStream())
{
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(gZipStream, obj);
return memoryStream.ToArray();
}
}
但是,当我使用 Total Commander 压缩相同的字节时,它总是将大小至少减少 50%。使用上面的代码,它将 58MB 压缩到 48MB,任何小于 15MB 的东西都会变得更大。
我应该使用第三方 zip 库还是在 .NET 3.5 中有更好的方法来做到这一点。我的问题还有其他选择吗?
编辑:
刚刚在上面的代码中发现了一个错误。安杰洛感谢您的修复。
GZipStream 压缩仍然不是很好。与 TC 48% 的压缩相比,gZipStream 的平均压缩率为 35%。
我不知道我从以前的版本中得到了什么样的字节:)
编辑2:
我发现了如何将压缩率从 20% 提高到 47%。我不得不使用两个内存流而不是一个!谁能解释为什么会这样?
这是一个带有 2 个内存流的代码,它的压缩效果更好!!!
using (MemoryStream msCompressed = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
using (MemoryStream msDecompressed = new MemoryStream())
{
new BinaryFormatter().Serialize(msDecompressed, obj);
byte[] byteArray = msDecompressed.ToArray();
gZipStream.Write(byteArray, 0, byteArray.Length);
gZipStream.Close();
return msCompressed.ToArray();
}