2008-09-20 11 views
8

.NET का उपयोग करना XmlSerializer का उपयोग करने में क्या सीमाएं (यदि कोई हैं) हैं? उदाहरण के लिए, क्या आप छवियों को एक्सएमएल में क्रमबद्ध कर सकते हैं?.NET का उपयोग करना XmlSerializer का उपयोग करने में क्या सीमाएं (यदि कोई हैं) हैं?

+0

कृपया पुन: टैग करें। यह एक सी #-विशिष्ट सवाल नहीं है। इसके बजाय ".net" के साथ टैग करें। –

उत्तर

18

XmlSerializer में कुछ कमियां हैं।

  1. यह सभी प्रकार के क्रमबद्ध होने के बारे में पता होना चाहिए। आप इसे इंटरफ़ेस द्वारा कुछ पास नहीं कर सकते हैं जो एक प्रकार का प्रतिनिधित्व करता है जिसे धारावाहिक नहीं जानता है।
  2. यह परिपत्र संदर्भ नहीं कर सकता है।
  3. ऑब्जेक्ट ग्राफ़ में कई बार संदर्भित होने पर यह एक ही ऑब्जेक्ट को कई बार क्रमबद्ध करेगा।
  4. निजी क्षेत्र क्रमबद्धता को संभाल नहीं सकता है।

I (बेवकूफ) ने इन समस्याओं में से कुछ को पाने के लिए अपना खुद का धारावाहिक लिखा। ऐसा मत करो; यह बहुत काम है और आपको सड़क के नीचे महीनों में सूक्ष्म बग मिलेगी। मेरे स्वयं के धारावाहिक और स्वरूपक को लिखने में प्राप्त एकमात्र चीज ऑब्जेक्ट ग्राफ़ क्रमबद्धता में शामिल मिन्यूशिया की अधिक प्रशंसा थी।

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

+0

मुझे लगता है कि 3.5SP1 के साथ आपको डेटाकंट्रैक्ट/डेटामेम्बर के साथ अब भी सजाने की आवश्यकता नहीं है। –

+0

+1: NetDataContractSerializer - यह मेरे लिए एक नया है। धन्यवाद! – x0n

2

कोई सीमा नहीं है तो सुनिश्चित नहीं है .. लेकिन .NET 1.1 में XmlSerialization में एक मेमोरी रिसाव बग था, आपको इस समस्या के साथ घूमने के लिए कैश सीरियलाइज़र ऑब्जेक्ट बनाना था ... वास्तव में, मैं नहीं सुनिश्चित करें कि यह समस्या .NET 2.0 या नए में तय की गई है ...

+0

किसी ने इसे क्यों कम किया? मैंने जो विंडोज सेवा लिखी है, उसे इस एक्सएमएलएसरियलाइज़र मेमोरी रिसाव से पीड़ित किया गया है, और आईएमएचओ शब्द फैलाना अच्छा है। – Larry

1

एक सीमा जिसे मैं सोच सकता हूं वह यह है कि XmlSerialization ऑप्ट-आउट है; जिसका मतलब है कि किसी वर्ग के किसी भी गुण जिसे आप धारावाहिक नहीं करना चाहते हैं उसे [XmlIgnore] से सजाया जाना चाहिए। तुलना करें कि DataContractSerializer जहां सभी गुण ऑप्ट-इन हैं, आपको स्पष्ट रूप से समावेशी विशेषताओं की घोषणा करनी होगी। यहां एक अच्छा write-up है।

छवियां या उनके बाइनरी सरणी XmlSerializer द्वारा बेस 64 एन्कोडेड टेक्स्ट के रूप में क्रमबद्ध हैं।

1

आपके द्वारा लिखे गए किसी भी वर्ग को सैद्धांतिक रूप से XmlSerializer के माध्यम से खिलाया जा सकता है। हाउवर, केवल सार्वजनिक क्षेत्रों तक पहुंच है, और कक्षाओं को सही विशेषताओं (उदा। XmlAttribute) के साथ चिह्नित करने की आवश्यकता है। बुनियादी ढांचे में भी, सब कुछ XmlSerializer का समर्थन नहीं करता है। उदाहरण के लिए System.Collections.Generic.Dictionary <>।

1

उदाहरण के लिए, आप IDictionary इंटरफ़ेस को लागू करने वाले वर्गों को क्रमबद्ध नहीं कर सकते हैं।

0

संग्रह के लिए उन्हें एक भी विधि लेने के लिए एक विधि जोड़ने की आवश्यकता है। यदि आपको केवल एक टेक्स्ट प्रारूप की आवश्यकता है और विशेष रूप से एक्सएमएल नहीं है तो आप JSON को आजमा सकते हैं। मैंने .NET, JsonExSerializer के लिए एक विकसित किया है, और अन्य http://www.json.org पर भी उपलब्ध हैं।

22

मुझे आम तौर पर XmlSerializer को किसी भी पीओसीओ के लिए खराब विकल्प माना जाता है जो कि केवल एक डीटीओ से अधिक है। यदि आपको विशिष्ट एक्सएमएल की आवश्यकता है, तो आप एक्सएमएल * एट्रिब्यूट और/या IXmlSerializable मार्ग पर जा सकते हैं - लेकिन आप ऑब्जेक्ट के साथ बहुत उलझन में हैं।

कुछ उद्देश्यों के लिए, यह अभी भी एक स्पष्ट विकल्प है - इसकी सीमाओं के साथ भी।लेकिन, डेटा को संग्रहीत करने और पुनः लोड करने के लिए, मुझे बाइनरीफॉर्मेटर को कम नुकसान के साथ एक बहुत आसान विकल्प मिल गया है।

यहाँ XmlSerializer के साथ कुछ खीज की एक सूची है - सबसे मैं एक बिंदु या किसी अन्य पर ने काट लिया गया है, दूसरों को मैं MSDN में अधिक पाया:

  • एक सार्वजनिक, कोई आर्ग निर्माता
  • केवल आवश्यक है सार्वजनिक पढ़ने/लिखने के गुणों और क्षेत्रों को क्रमबद्ध करता है
  • सभी प्रकारों को ज्ञात होने की आवश्यकता है
  • वास्तव में get_ * और set_ * में कॉल करता है, इसलिए सत्यापन, आदि चलाया जाएगा। यह अच्छा है या बुरा हो सकता है (कॉल के आदेश के बारे में सोचने के रूप में अच्छी तरह से)
  • केवल विशिष्ट नियमों

XmlSerializer वर्गों है कि लागू करने के लिए विशेष उपचार देता है के अनुरूप IEnumerable या ICollection संग्रह को क्रमानुसार करेंगे IEnumerable या ICollection। एक वर्ग जो IENumerable लागू करता है उसे एक सार्वजनिक जोड़ें विधि लागू करना आवश्यक है जो एक पैरामीटर लेता है। Add विधि का पैरामीटर उसी प्रकार का होना चाहिए जैसा कि वर्तमान संपत्ति से GetEnumerator से लौटाए गए मान पर या उस प्रकार के अड्डों में से एक पर लौटाया गया है।

आईन्यूमेरेबल के अलावा आईसीओलेक्शन (जैसे कलेक्शनबेस) लागू करने वाली एक कक्षा में सार्वजनिक आइटम अनुक्रमित संपत्ति (सी # में इंडेक्सर) होना चाहिए जो एक पूर्णांक लेता है, और इसमें एक प्रकार की पूर्णांक की सार्वजनिक गणना संपत्ति होनी चाहिए। ऐड विधि का पैरामीटर उसी प्रकार का होना चाहिए जैसा कि आइटम प्रॉपर्टी से लौटाया गया है, या उस प्रकार के बेस में से एक है। आईसीओलेक्शन को लागू करने वाले वर्गों के लिए, अनुक्रमित किए जाने वाले मान अनुक्रमित आइटम प्रॉपर्टी से पुनर्प्राप्त किए जाते हैं, न कि GetEnumerator को कॉल करके।

  • IDictionary
  • गतिशील रूप से उत्पन्न उपयोगों को विधानसभाओं, जो एप्लिकेशन डोमेन से उतार नहीं सकता है क्रमानुसार नहीं करता है।

प्रदर्शन को बढ़ाने के लिए, एक्सएमएल क्रमबद्धता बुनियादी सुविधाओं गतिशील क्रमानुसार और निर्दिष्ट प्रकार deserialize करने के लिए विधानसभाओं उत्पन्न करता है। आधारभूत संरचना उन विधानसभाओं को पाती है और उनका पुन: उपयोग करती है। यह व्यवहार केवल तब होता है जब निम्नलिखित कंस्ट्रक्टर्स का उपयोग कर:

XmlSerializer.XmlSerializer (प्रकार) XmlSerializer.XmlSerializer (प्रकार, स्ट्रिंग)

आप अन्य निर्माताओं के किसी भी उपयोग करते हैं, एक ही विधानसभा के कई संस्करण उत्पन्न कर रहे हैं और कभी भी अनलोड नहीं किया जाता है, जिसके परिणामस्वरूप स्मृति रिसाव और खराब प्रदर्शन होता है।

  • ArrayList [] या सूची < टी > []
  • है अन्य अजीब किनारे मामलों
  • को क्रमानुसार नहीं कर सकते

XmlSerializer एक गणन क्रमानुसार करने निम्न स्थितियों रहे हैं instantiated नहीं किया जा सकता है सत्य: गणना अनुक्रमित लंबी (सी # में उलझन) है और गणना में किसी भी सदस्य के पास 9, 223,372,036,854,775,807 से अधिक मूल्य वाला कोई सदस्य होता है।

XmlSerializer क्लास अब ऑब्जेक्ट्स को क्रमबद्ध नहीं करता है जो [अप्रचलित] के रूप में चिह्नित हैं।

किसी ऑब्जेक्ट को deserialize करने के लिए आपको अस्थायी निर्देशिका (जैसा कि TEMP पर्यावरण चर द्वारा परिभाषित किया गया है) को लिखने की अनुमति होनी चाहिए।

  • .InnerException पढ़ने की आवश्यकता है त्रुटियों
+0

जीज़, यह बहुत है! सीमाओं का! विस्तार के लिए धन्यवाद। +1 वोट – Phil

3

पर किसी भी उपयोगी जानकारी पाने के लिए एक और समस्या यह है कि XmlSerializer के निर्माता बुला रनटाइम पर कोड संकलन जाएगा और एक अस्थायी DLL (उत्पन्न होगा% अस्थायी में है % फ़ोल्डर) कोड को डी/क्रमबद्ध करने के लिए कोड के साथ।

अगर आप app.config निम्न पंक्तियां जोड़ें आप कोड देख सकते हैं:

<system.diagnostics> 
    <switches> 
     <add name="XmlSerialization.Compilation" value="4"/> 
    </switches> 
    </system.diagnostics> 

यह बहुत समय पहली बार जब आप एक वर्ग को क्रमानुसार लेता है और संकलन और लिखने के लिए अनुमति के साथ कोड की जरूरत डिस्क।

वीएस 2005+ के साथ आने वाले sGen.exe उपकरण का उपयोग करके इन डीएलएल को प्रीकंपाइल करने का एक तरीका है।

Look here for more information

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