2009-08-27 11 views
7

.NETのBinaryFormatterを使用してオブジェクトグラフをシリアライズすると、どのような種類の圧縮が適用されますか?BinaryFormatterは圧縮を適用しますか?

私は多くの繰り返しの文字列と整数を持つオブジェクトグラフについて心配する必要があるかどうか尋ねます。

編集 - 文字列が.NETでインターンされている場合、繰り返し文字列を心配する必要はありません。

+0

プリミティブは幸せに繰り返されます。唯一の「圧縮」は、シーケンス内の番号を表すバイトまたは整数として中断されていないヌルのシーケンス(配列など)が格納されることです。文字列は(一般的に)繰り返されず、クラス定義は繰り返されず、複数のオブジェクト参照によってオブジェクトが複数回シリアライズ/出力されることはありません。 – Tao

答えて

10

いいえ、圧縮は行われませんが、GZipStreamタイプを使用して出力を圧縮することができます。

編集:Mehrdadは、How to compress a .net object instance using gzipの彼の答えにこの技術の素晴らしい例があります。

編集2:ストリングス抑留することができますが、それはすべての文字列を抑留していることを意味するものではありません。私はCLRがインターン文字列をどうやってどのように、なぜそれを理由からバージョンごとに変えることができるかについて、何の仮定もしていないでしょう。

4

いいえ、それはしませんが、...

私はちょうど今日私のアプリのための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を使用している場合、あなたがチェーン(UN)右この道をcrypting(デ)ビュンとすることをちょっと重要である、なぜなら暗号化がデータからノイズを生成する前に、エントロピーを失いたくなるでしょう。

関連する問題