2009-06-08 16 views
5

Önbelleğe eklemeden önce QUERYS veritabanından sonuçları sıkıştırmak istiyorum.gzip kullanarak bir .net nesnesi örneği nasıl sıkıştırılır

Herhangi bir referans türünü sıkıştırmak istiyorum.

Ben .. Scott Hanselman'ın 'ın blog post http://shrinkster.com/173t

bir .net nesnesi sıkıştırmak için herhangi bir fikir dayalı fikri dizeleri sıkıştırmak için bu bir çalışma versiyonu?

ben önbellekte nesneler sadece bayt dizileri olacağından bu salt okunur bir önbellek olacağını biliyoruz ..

cevap

20

Bu herhangi başvuru türü için çalışmaz. Bu, Serializable türleri için çalışacaktır. Bir dosyasına yöneltilen bir sıkıştırma akışına bir BinaryFormatter bağlayın: Sen yerine bir dosyaya yazmak yerine, bellekte içeriğini tutmak için bir MemoryStream kullanabilirsiniz

var formatter = new BinaryFormatter(); 
using (var outputFile = new FileStream("OutputFile", FileMode.CreateNew)) 
using (var compressionStream = new GZipStream(
         outputFile, CompressionMode.Compress)) { 
    formatter.Serialize(compressionStream, objToSerialize); 
    compressionStream.Flush(); 
} 

. Bununla birlikte, bunun bir önbellek için gerçekten etkili bir çözüm olduğundan şüpheliyim.

+1

Bu gerçekten yardımcı oldu, bu sıkıştırmanın nasıl görüneceğini gerçekten yararlı oldu ... Daha önce hiç kullanılmamış BinaryFormatter. –

+0

Bunu kolayca kopyaladığım için + şifreli koduma yazdığınız için teşekkür ederiz. Bunları genellikle biçimlendiririm, ki bu sadece Google’da kolayca bulabildiğim bir pasaj. +1 –

3

Önbelleğe ne tür nesneler koyuyorsunuz? Nesneleri yazdılar mı? Veya DataTable gibi şeyler? DataTable için, belki de GZipStream aracılığıyla sıkıştırılmış xml olarak saklayın. Yazılan (varlık) nesneler için muhtemelen bunları serileştirmeniz gerekecektir.

Sen BinaryFormatter ve GZipStream, kullanabilir ya da sadece zaten çok kompakt protobuf-net serileştirme (ücretsiz) gibi bir şey kullanabilirsiniz (- yoğun ikili tipik GZipStream ekleyerek tipik veri büyük yapar). Özellikle, protobuf-net gibi şeylerin avantajı, seri hale getirme sırasında CPU unzipping maliyetini ödemek zorunda kalmadan azaltılmış boyutu elde etmektir.'dan önce 10'da GZipStream ekleyerek, BinaryFormatter'dan 4 kat daha hızlıdır. GZip için BinaryFormatter'a ekstra zaman ekleyin ve kayda değer marjı ile kazanmalısınız.

2

Bugün uygulamam için GZipStream desteğini ekledim, bu yüzden bazı kodları burada paylaşabilirim;

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.

İlgili konular