私はデータベースに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でこれを行うよりよい方法がありますか。 私の問題の他の選択肢はありますか?
EDIT:
ただ、上記のコードにバグを発見しました。あなたの修正のためにアンジェロに感謝します。
GZipStreamの圧縮率はそれほど高くありません。 私は、TC 48%圧縮と比較して、gZipStreamで平均35%圧縮を取得します。
私は、以前のバージョンで出てきたバイトの種類見当がつかない:)
EDIT2:
47%に20%から圧縮を向上させるために、どのように私を発見しました。 私は1つではなく2つのメモリストリームを使用しなければなりませんでした!誰もがなぜこの場合に説明できますか?
ここでは、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