2009-08-27 19 views
7

.NET'in BinaryFormatter bir nesne grafiğini serileştirmek için kullanıldığında, herhangi bir sıkıştırma türü uygulanıyor mu?BinaryFormatter herhangi bir sıkıştırma uygular mı?

Yinelenen dizeleri ve tam sayıları olan nesne grafiği hakkında endişelenmem gerekip gerekmediği bağlamında soruyorum.

Düzenle - Dizeleri .NET'te barındırılıyorsa bekle, yinelenen dizeler hakkında endişelenmenize gerek yok, değil mi?

+0

Primitifler mutlu bir şekilde tekrarlanırlar, bu durumda ortaya çıkan tek "sıkıştırma", kesintisiz diziler (örneğin bir dizide), dizideki sayıyı temsil eden bayt veya tamsayı olarak saklanmasıdır. Dizgiler (genellikle) tekrarlanmaz, sınıf tanımları tekrarlanmaz ve çoklu nesne referansları nesnenin birçok kez serileştirilmesi/çıkması ile sonuçlanmaz. – Tao

cevap

10

Hayır, herhangi bir sıkıştırma sağlamaz, ancak çıktıyı GZipStream türünü kullanarak kendiniz sıkıştırabilirsiniz.

Düzenleme:MehrdadHow to compress a .net object instance using gzip cevabında bu tekniğin harika bir örneğine sahiptir.

Düzenleme 2: Strings staj edilebilir ama bu her dize enterne olduğu anlamına gelmez. CLR'nin niçin ya da niçin niçin niçin ya da neden değiştirdiğine dair herhangi bir varsayımda bulunmazdım, çünkü bu, versiyondan versiyona değişebilir (ve değişti).

4

Hayır, ... değil ama

Sadece benim app bugün için GZipStream desteği eklendi, bu yüzden burada biraz kod paylaşabilir;

Serile:

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); 
     } 
    } 
} 

Seri kaldırma:

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); 
     } 
    } 
} 

NOT: CryptoStream kullanırsanız, çünkü zincir (me) sıkıştırma ve (de) bu taraftan crypting bu biraz önemlidir Şifreleriniz, verilerinizden parazit oluşturmadan ÖNCE tümlüğünü kaybetmek istersiniz.