2012-03-20 20 views
8

मैं DataContractSerializer के व्यवहार के साथ विस्मित कर रहा हूँ के कारण विफल रहता है। हमारी विन्यास एक्सएमएल आधारित है। XML को DataContractSerializer.ReadObject विधि के स्रोत के रूप में उपयोग किया जाता है। हाल ही में मुझे एक समस्या का सामना करना पड़ा है जब deserialized वस्तु के कुछ गुण सेट नहीं थे। मैंने परिवर्तनों को ट्रैक किया है और पाया है कि उन गुणों को मैन्युअल रूप से एक्सएमएल में जोड़ा गया था। जो मेरी राय में ठीक है। स्पष्ट रूप से यह DataContractSerializer की राय में ठीक नहीं था क्योंकि ऐसा प्रतीत होता है कि यह एक्सएमएल नोड्स को वर्णानुक्रमित करने का अनुमान लगाता है। वास्तव में?! Deserialization वास्तव में सीधी चीज की तरह लगता है - अनुक्रमिक रूप से एक्सएमएल पढ़ें, पार्स नोड नाम, संबंधित संपत्ति सेट करें। आदेश का उद्देश्य क्या है?DataContract अक्रमांकन एक्सएमएल नोड्स के गलत आदेश

क्या कोई कामकाज है? शायद DataContractSerializer के लिए कुछ प्रकार की सेटिंग्स?

उत्तर

3

मैं हाल ही में इस समस्या का सामना करना पड़ा। यह हल करने के लिए, मैं XmlSerializer का इस्तेमाल किया और XmlElement विशेषताओं से स्पष्ट आदेश हटाया:

set proxy_tool="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SvcUtil.exe" /nologo /t:code /ser:XmlSerializer /UseSerializerForFaults 
set sed_tool="$(ProjectDir)sed.exe" -r -i "s/,?[[:space:]]*Order=[[:digit:]]+//" 

%proxy_tool% /o:"Proxy1.cs" /n:*,Namespaces.Name1 "Proxy1.wsdl" 
%sed_tool% "Proxy1.cs" 

%proxy_tool% /o:"Proxy2.cs" /n:*,Namespaces.Name2 "Proxy2.wsdl" 
%sed_tool% "Proxy2.cs" 

... 

कुछ more information on my blog post नहीं है।

यदि आप जानना चाहते हैं कि आदेश क्यों मायने रखता है, तो ऐसा इसलिए है क्योंकि एक्सएसडी में sequence एक निर्धारित आदेश है, और वेब सेवा अनुबंध XSD के साथ परिभाषित किया गया है।

the specification से:

इस परिभाषा का परिणाम यह है किसी भी तत्व (po.xml में जैसे shipTo) एक उदाहरण है जिसका प्रकार USAddress होने के लिए घोषित किया जाता है में प्रदर्शित होने के पांच तत्वों और एक विशेषता से मिलकर चाहिए है। घोषणाओं के नाम विशेषताओं, के मानों के अनुसार इन तत्वों को नाम, सड़क, शहर, राज्य और ज़िप कहा जाना चाहिए और तत्वों को उसी अनुक्रम (क्रम) में प्रकट होना चाहिए जिसमें उन्हें घोषित किया गया है।

+0

वाह ... ऐसा लगता है कि एक टैड बहुत जटिल है। लेकिन उत्तर के लिए धन्यवाद। मैं DataContractSerializer कोशिश कर समाप्त हो गया और यह मेरे लिए बेहतर काम किया। – Schultz9999

+0

क्या डेटाकंट्रैक्ट में कोई "xs: all" परिभाषा का उपयोग करने का कोई तरीका नहीं है? तो फिर कोई फर्क नहीं पड़ता? – Nicholi

+0

@ निकोली शायद यदि आपके पास डब्लूएसडीएल पर नियंत्रण है –

3

आप इस के साथ मदद करने के लिए DataMemberAttribute के आदेश सदस्य का उपयोग कर सकते हैं, लेकिन ज्यादातर मामलों में: एक्सएमएल आदेश-विशिष्ट (तत्वों के लिए, नहीं विशेषताएँ) है - तो यह विशेष रूप से गलत नहीं है।

यह कहा गया: यदि आप एक्सएमएल सीरियलाइजेशन पर अच्छा नियंत्रण चाहते हैं, तो डेटाकंट्रैक्टसेरियलाइज़र एक खराब विकल्प है XmlSerializer अधिक नियंत्रण प्रदान करता है - और कम fussy re order iirc है।

+0

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