【发布时间】:2012-08-18 18:59:45
【问题描述】:
我在内存中有一个大对象,我想将它作为 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 中有更好的方法来做到这一点。 我的问题还有其他替代方案吗?
编辑:
刚刚在上面的代码中发现了一个错误。 Angelo 感谢您的修复。
GZipStream 压缩仍然不是很好。 与 TC 48% 的压缩相比,gZipStream 的平均压缩率为 35%。
我不知道我从以前的版本中得到了什么样的字节:)
EDIT2:
我发现了如何将压缩率从 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();
}
【问题讨论】:
标签: c# serialization .net-3.5 gzipstream