2009-08-27 42 views
7

當NET的BinaryFormatter用來序列一個對象圖,是應用的任何類型的壓縮的?BinaryFormatter是否應用了任何壓縮?

我問我是否應該擔心有很多重複的字符串和整數對象圖的上下文。

編輯 - 堅持下來,如果字符串是在.NET中實現的,那麼就沒有必要擔心重複的字符串了吧?

+0

原語愉快地重複令人生厭,所發生的唯一的「壓縮」是空值的不間斷的序列(例如在陣列中)被存儲作爲表示該序列中的字節數或整數。字符串(通常)不能重複的,類定義不重複,並且多個對象的引用不導致在對象被序列/輸出多次。 – Tao 2010-06-20 21:16:10

回答

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)壓縮和(DE)crypting權這種方式,因爲你會想在你的數據加密之前失去你的熵。

相關問題