7

.NETBinaryFormatterを使用してオブジェクト グラフをシリアル化する場合、何らかの圧縮が適用されますか?

オブジェクトグラフに多くの文字列と整数が繰り返されることを心配する必要があるかどうかという文脈で尋ねます。

編集- ちょっと待ってください。文字列が .NET にインターンされている場合、文字列の繰り返しについて心配する必要はありませんよね?

4

2 に答える 2

10

いいえ、圧縮は提供しませんが、GZipStreamタイプを使用して自分で出力を圧縮できます。

編集: Mehrdadは、 How to compress a .net object instance using gzip への回答で、この手法の素晴らしい例を示しています。

編集 2:文字列はインターンできますが、すべての文字列インターンされるわけではありません。CLR が文字列をインターンすることを決定する方法または理由について、これはバージョンごとに変更される可能性がある (そして変更されている) ため、私は何も仮定しません。

于 2009-08-27T15:36:38.363 に答える
5

いいえ、そうではありませんが...

今日、アプリに GZipStream サポートを追加したので、ここでいくつかのコードを共有できます。

シリアライゼーション:

using (Stream s = File.Create(PathName))
{
    RijndaelManaged rm = new RijndaelManaged();
    rm.Key = CryptoKey;
    rm.IV = CryptoIV;
    using (CryptoStream cs = new CryptoStream(s, rm.CreateEncryptor(), CryptoStreamMode.Write))
    {
        using (GZipStream gs = new GZipStream(cs, CompressionMode.Compress))
        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(gs, _instance);
        }
    }
}

逆シリアル化:

using (Stream s = File.OpenRead(PathName))
{
    RijndaelManaged rm = new RijndaelManaged();
    rm.Key = CryptoKey;
    rm.IV = CryptoIV;
    using (CryptoStream cs = new CryptoStream(s, rm.CreateDecryptor(), CryptoStreamMode.Read))
    {
        using (GZipStream gs = new GZipStream(cs, CompressionMode.Decompress))
        {
            BinaryFormatter bf = new BinaryFormatter();
            _instance = (Storage)bf.Deserialize(gs);
        }
    }
}

注:CryptoStreamを使用する場合、暗号化によってデータからノイズが発生する前にエントロピーを失いたいため、このように(解凍)圧縮と(復号化)暗号化を連鎖させることが少し重要です。

于 2011-05-10T13:31:05.127 に答える