2009-08-27 16 views
7

जब किसी ऑब्जेक्ट ग्राफ़ को क्रमबद्ध करने के लिए .NET के BinaryFormatter का उपयोग किया जाता है, तो क्या किसी भी प्रकार का संपीड़न लागू होता है?क्या बाइनरीफॉर्मेटर कोई संपीड़न लागू करता है?

मैं इस संदर्भ में पूछता हूं कि मुझे ऑब्जेक्ट ग्राफ़ के बारे में चिंता करनी चाहिए जिसमें कई बार दोहराए गए तार और पूर्णांक हैं।

संपादित करें - यदि स्ट्रिंग को .NET में प्रशिक्षित किया गया है, तो दोबारा तारों के बारे में चिंता करने की आवश्यकता नहीं है, है ना?

+0

प्राइमेटिव्स खुशी से विज्ञापन मतली को दोहराया जाता है, ऐसा होता है कि केवल "संपीड़न" होता है कि नल के निर्बाध अनुक्रम (जैसे सरणी में) अनुक्रम में संख्या का प्रतिनिधित्व करने वाले बाइट्स या पूर्णांक के रूप में संग्रहीत होते हैं। स्ट्रिंग्स (आमतौर पर) दोहराई नहीं जाती हैं, कक्षा परिभाषाओं को दोहराया नहीं जाता है, और कई ऑब्जेक्ट संदर्भों का परिणाम ऑब्जेक्ट को कई बार क्रमबद्ध/आउटपुट नहीं किया जाता है। – Tao

उत्तर

10

नहीं, यह कोई संपीड़न प्रदान नहीं करता है लेकिन आप GZipStream प्रकार का उपयोग कर आउटपुट को स्वयं संकुचित कर सकते हैं।

संपादित करें:MehrdadHow to compress a .net object instance using gzip के उत्तर में इस तकनीक का एक शानदार उदाहरण है।

संपादित करें 2: स्ट्रिंग्स प्रशिक्षु जा सकती है, लेकिन इसका मतलब यह नहीं है कि हर स्ट्रिंग प्रशिक्षु है। मैं इस बात पर कोई धारणा नहीं दूंगा कि सीएलआर स्ट्रिंग को इंटर्न करने का फैसला क्यों करता है क्योंकि यह संस्करण से संस्करण में बदल सकता है (और बदल गया है)।

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

Deserialization:

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 उपयोग करते हैं, यह थोड़े महत्वपूर्ण है कि आप श्रृंखला (अन) ज़िप करने और (डी) सही इस तरह से crypting है, क्योंकि एन्क्रिप्शन आपके डेटा से शोर बनाता है इससे पहले कि आप अपना एन्ट्रॉपी खोना चाहेंगे।

संबंधित मुद्दे