46

के बीच मतभेद हैं मैं पिछले सप्ताह के समय का एक बड़ा भाग खर्च क्रमबद्धता पर काम कर रहा। उस समय के दौरान मुझे बाइनरीफॉर्मेटर या एक्सएमएलएसरियलाइज़र का उपयोग करने वाले कई उदाहरण मिले। दुर्भाग्यवश, जो मुझे नहीं मिला वह दोनों उदाहरणों के बीच मतभेदों का विस्तार से वर्णन कर रहे थे।क्या XmlSerializer और BinaryFormatter

मेरी जिज्ञासा की उत्पत्ति इस बात पर निहित है कि क्यों बाइनरीफॉर्मेटर सीधे इंटरफ़ेस को deserialize करने में सक्षम है, जबकि XmlSerializer नहीं है। "casting to multiple (unknown types) at runtime" का उत्तर में Jon Skeet एक अंतरफलक के लिए सीधी द्विआधारी क्रमबद्धता का एक उदाहरण प्रदान करता है। Stan R. मेरे लिए अपने जवाब में XmlSerializer का उपयोग कर अपने लक्ष्य को पूरा करने के साधन के साथ प्रदान की "XML Object Deserialization to Interface।"

बाइनरीफॉर्मेटर के स्पष्ट से परे बाइनरी सीरियलाइजेशन का उपयोग करता है जबकि XmlSerializer XML का उपयोग करता है, मैं मौलिक मतभेदों को और अधिक समझना चाहता हूं। एक या दूसरे और प्रत्येक के पेशेवरों और विपक्ष का उपयोग कब करें।

उत्तर

87

कारण एक द्विआधारी फ़ॉर्मेटर एक अंतरफलक प्रकार को सीधे deserialize करने में सक्षम है क्योंकि जब एक वस्तु प्रकार और विधानसभा जानकारी युक्त एक बाइनरी धारा मेटाडाटा को मूल रूप से धारावाहिक है वस्तु डेटा के साथ में फंस गया है है। इसका अर्थ यह है कि जब बाइनरी फॉर्मेटर ऑब्जेक्ट को deserializes, यह इसके प्रकार जानता है, सही वस्तु बनाता है और फिर आप इसे एक इंटरफ़ेस प्रकार पर डाल सकते हैं जो ऑब्जेक्ट्स लागू करता है।

दूसरी ओर एक्सएमएल सीरिएलाइज़र सिर्फ एक स्कीमा को क्रमबद्ध करता है और केवल वस्तु के सार्वजनिक क्षेत्रों और मूल्यों को क्रमबद्ध करता है और अन्य प्रकार की जानकारी नहीं देता है (उदाहरण के लिए प्रकार के उपकरण को इंटरफेस करता है)।

यहां एक अच्छी पोस्ट, .NET Serialization, BinaryFormatter, SoapFormatter, और XmlSerializer की तुलना है। मैं आपको निम्न तालिका को देखने की अनुशंसा करता हूं जो पहले उल्लिखित धारावाहिकों के अलावा DataContractSerializer, NetDataContractSerializer और protobuf-net शामिल है।

Serialization Comparison

+1

अच्छी तालिका। मुझे हमेशा जेनेरिक परेशान SOAP की कमी मिली। –

+1

@ahsteele - आप एक स्टार –

+5

मेरा मानना ​​है कि "सबसे अच्छा प्रदर्शन" वर्गीकरण गलत है कर रहे हैं। बाइनरी फॉर्मेटर .NET में सबसे खराब प्रदर्शन करने वाला सीरियलाइज़र है (शायद साबुन फॉर्मेटर को छोड़कर)। http://blogs.msdn.com/b/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx, http: // जेम्स कम से कम है कि जो सबसे मानक दिखाने के लिए है। newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx, http://techmikael.blogspot.com/2010/01/net-serialization-performance.html – joniba

1

एक्सएमएलएसरियलाइज़र सभी प्रकार के गुणों को पढ़कर इस प्रकार का क्रमबद्ध करता है जिसमें सार्वजनिक गेटर और सार्वजनिक सेटटर (और कोई भी सार्वजनिक क्षेत्र) दोनों होते हैं। इस अर्थ में XmlSerializer उदाहरण के "सार्वजनिक दृश्य" को क्रमबद्ध/deserializes।

बाइनरी फॉर्मेटर, इसके विपरीत, उदाहरण के "आंतरिक", यानी इसके क्षेत्रों को क्रमबद्ध करके एक प्रकार का क्रमबद्ध करता है। कोई भी फ़ील्ड जिसे [NonSerialized] के रूप में चिह्नित नहीं किया गया है उसे बाइनरी स्ट्रीम में क्रमबद्ध किया जाएगा। इस प्रकार को स्वयं को [सीरियलज़ेबल] के रूप में चिह्नित किया जाना चाहिए क्योंकि किसी आंतरिक क्षेत्र को भी क्रमबद्ध किया जाना चाहिए।

2

एक्सएमएल सीरिएलाइज़र एक्सएमएल और एक एक्सएमएल स्कीमा (निस्संदेह) उत्पन्न करता है। यह एक्सएमएल का उत्पादन करेगा जो इस स्कीमा के अनुरूप है।

एक निहितार्थ यह है कि यह कुछ भी क्रमबद्ध नहीं करेगा जिसे एक्सएमएल स्कीमा में वर्णित नहीं किया जा सकता है। उदाहरण के लिए, एक्सएमएल स्कीमा में एक सूची और एक सरणी के बीच अंतर करने का कोई तरीका नहीं है, इसलिए धारावाहिक द्वारा उत्पादित एक्सएमएल स्कीमा का अर्थ किसी भी तरीके से किया जा सकता है।

रनटाइम क्रमबद्धता (जो BinaryFormatter का हिस्सा है), दूसरी तरफ वास्तविक नेट प्रकार serializes इसलिए यदि आप एक List<int> भेजने के लिए, दूसरी तरफ एक List<int> मिल जाएगा।

कि स्पष्ट रूप से बेहतर काम करता है, तो दूसरी तरफ नेट चल रहा है।

+0

हाय जॉन, मैं सिर्फ अगर एक सूची से निपटने कोई मुद्दा नहीं है सोच रहा था, तब भी आप BinaryFormatter पसंद करेंगे? – paradisonoir

+0

सं। सूची सिर्फ एक उदाहरण था। दोनों के पास पूरी तरह से अलग-अलग मामलों का उपयोग है। बीटीडब्ल्यू, साबुनफॉर्मेटर देखें।रनटाइम सीरियलाइजेशन (दो फॉर्मेटर्स) एक्सएमएल सीरियलाइजेशन से बिल्कुल अलग है, जो डाटा कॉन्ट्रैक्ट सीरियलाइजेशन से बहुत अलग है। –

0

मुझे लगता है कि सबसे महत्वपूर्ण बात यह है कि बाइनरी क्रमबद्धता सार्वजनिक और निजी दोनों सदस्यों को क्रमबद्ध कर सकती है, जबकि दूसरा केवल सार्वजनिक लोगों के साथ काम करता है।

यहां, यह आकार के मामले में इन दोनों के बीच एक बहुत उपयोगी तुलना प्रदान करता है। यह एक बहुत ही महत्वपूर्ण मुद्दा है, क्योंकि आप अपने सीरियलाइज्ड ऑब्जेक्ट को रिमोट मशीन पर भेज सकते हैं।

http://www.nablasoft.com/alkampfer/index.php/2008/10/31/binary-versus-xml-serialization-size/

6

बस में वजन करने के लिए ...

दोनों के बीच स्पष्ट अंतर "xml बनाम बाइनरी" है, लेकिन यह एक बहुत है कि तुलना में गहरी जाना करता है:

  • क्षेत्रों (BinaryFormatter = BF के) बनाम सार्वजनिक सदस्यों (आमतौर पर गुण) (XmlSerializer = XS)
  • प्रकार मेटाडाटा आधारित (बीएफ) बनाम अनुबंध-बा एसईडी (XS)
  • संस्करण-भंगुर (बीएफ) बनाम संस्करण सहिष्णु (XS)
  • "ग्राफ" (बीएफ) बनाम "पेड़" (XS)
  • नेट विशिष्ट (बीएफ) बनाम पोर्टेबल (XS)
  • अपारदर्शी (बीएफ) बनाम मानव पठनीय (XS)

क्यों BinaryFormatter, भंगुर हो सकता है see here की चर्चा के रूप में।

यह चर्चा करने के लिए जो बड़ा है असंभव है; BinaryFormatter में सभी प्रकार के मेटाडेटा इसे बड़ा बना सकते हैं। और XmlSerializer gzip जैसे संपीड़न के साथ बहुत काम कर सकते हैं।

हालांकि, प्रत्येक की ताकत लेना संभव है; उदाहरण के लिए, Google ने अपने डेटा सीरियलाइजेशन प्रारूप, "प्रोटोकॉल बफर" को खुले-सोर्स किया है। यह वह जगह है:

  • संविदा आधारित
  • पोर्टेबल (देखें list of implementations)
  • संस्करण सहिष्णु
  • वृक्ष-आधारित
  • अपारदर्शी (जब एक .proto के साथ संयुक्त हालांकि वहां डेटा दिखाने के लिए उपकरण हैं)
  • आम तौर पर "contract first", लेकिन कुछ कार्यान्वयन प्रतिबिंब
पर आधारित अनुबंधों को अनुमति देते हैं

लेकिन महत्वपूर्ण बात, यह बहुत घने डेटा (कोई प्रकार मेटाडाटा, शुद्ध द्विआधारी प्रतिनिधित्व, छोटे टैग, संस्करण-लंबाई आधार-7 एन्कोडिंग की तरह चाल), और बहुत प्रक्रिया के लिए कुशल (कोई जटिल XML संरचना, कोई तार करने के लिए मैच के लिए है सदस्यों, आदि)।

मैं एक छोटे से पक्षपाती हो सकता है; मैं कार्यान्वयन में से एक को बनाए रखने के (सी #/नेट के लिए कई उपयुक्त भी शामिल है।), लेकिन आप ध्यान दें कि मैं किसी भी विशिष्ट कार्यान्वयन से जुड़ा हुआ नहीं है; प्रारूप खड़ा के तहत अपने स्वयं के गुण ;-p