我在內存中有一個大對象,我想將它保存爲數據庫中的一個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();
}
}
然而,當我同壓縮字節,總指揮官它總是減少了大小至少50%。通過上面的代碼,它可以壓縮58MB到48MB,而小於15MB的任何東西都會變得更大。
我應該使用第三方zip庫還是有更好的方法在.NET 3.5中做到這一點。 我的問題的任何其他替代方案?
編輯:
剛剛發現上面代碼中的錯誤。安傑洛謝謝你的解決。
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();
}
我使用http://www.icsharpcode。net/opensource/sharpziplib/Download.aspx取得巨大成功。 – Asken