2011-01-20 20 views
5

मैं डेटाकंट्राक्टेरियलाइज़र और बाइनरीफॉर्मर सीरियलाइज़र के बारे में अधिक समझने के लिए लेखों के माध्यम से जा रहा था। अब तक किए गए पढ़ने के आधार पर मैं इस धारणा के तहत था कि बाइनरीफॉर्मेटर में डेटाकॉन्ट्राक्टेरियलाइज़र की तुलना में कम पदचिह्न होना चाहिए। DataContractSerializer का कारण xml infoset को क्रमबद्ध करता है जबकि बाइनरीफॉर्मर मालिकाना बाइनरी प्रारूप में क्रमबद्ध होता है।डेटाकंट्रैक्टसेरियलाइज़र बनाम बाइनरीफॉर्मेटर प्रदर्शन

के बाद परीक्षण

[Serializable] 
    [DataContract] 
    public class Packet 
    { 
     [DataMember] 
     public DataSet Data { get; set; } 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Description { get; set; } 
    } 

डेटासेट [AdventureWorks].[Sales].[SalesOrderDetail] तालिका

using (var fs = new FileStream("test1.txt", FileMode.Create)) 
    { 
     var dcs = new DataContractSerializer(typeof(Packet)); 
     dcs.WriteObject(fs, packet); 
     Console.WriteLine("Total bytes with dcs = " + fs.Length); 
    } 



    using(var fs = new FileStream("test2.txt", FileMode.Create)) 
    { 
     var bf = new BinaryFormatter(); 
     bf.Serialize(fs, packet); 
     Console.WriteLine("Total bytes with binaryformatter = " + fs.Length); 
    } 


Results 
Total bytes with dcs = 57133023 
Total bytes with binaryformatter = 57133984 

प्रश्न से 121317 पंक्तियों के साथ बसा हुआ था है क्यों BinaryFormatter के लिए बाइट गिनती DataContractSerializer से अधिक है? क्या यह बहुत कम नहीं होना चाहिए?

उत्तर

5

DataSet की एक बुरी आदत है: यह ISerializable लागू करता है और फिर BinaryFormatter पर पास होने पर भी डिफ़ॉल्ट रूप से एक्सएमएल की स्ट्रिंग के रूप में इसकी सामग्री को क्रमबद्ध करता है। यही कारण है कि दो धाराएं आकार में लगभग समान हैं। यदि आप RemotingFormat प्रॉपर्टी को Binary में बदलते हैं, तो यह वही काम करेगा, लेकिन एक नया BinaryFormatter बनाकर, खुद को MemoryStream में डंप कर, और उसके बाद परिणामी बाइट सरणी को बाहरी BinaryFormatter की स्ट्रीम में मान के रूप में डालें।

उस के बाहर, BinaryFormatter प्रकारों के बारे में अधिक जानकारी लेता है, जैसे वे असेंबली का पूरा नाम; DataSet के लिए XML के शीर्ष पर प्रति-ऑब्जेक्ट ओवरहेड भी है।

यदि आप दो धारावाहिकों के व्यवहार की तुलना करने की कोशिश कर रहे हैं, तो DataSet एक खराब विकल्प है क्योंकि यह बहुत अधिक ओवरराइड करता है।

+0

अंतर्दृष्टि के लिए धन्यवाद। मैं डेटासेट का उपयोग कर अटक गया हूँ। बहुत सारे मुद्दे !! – stackoverflowuser

+0

@ स्टैकओवरफ्लोउज़र: यदि आकार एक बड़ा मुद्दा है, तो मुझे डिफ्लेटर के माध्यम से केवल धारावाहिक स्ट्रीम चलाने के साथ उत्कृष्ट भाग्य मिला है। –

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