我在内存中有一个很大的对象,希望将其保存为数据库中的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%。
我不知道以前版本输出了哪种类型的字节 :)
第二次编辑:
我已经找到了如何将压缩从20%提高到47%。 我必须使用两个Memory Stream而不是一个!有人能解释为什么吗?
此处是使用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();
}