2008-08-29 13 views
5

में बदल गया है। मैंने .NET 3.5 SP1 में बदलावों पर कुछ पोस्ट देखी हैं, लेकिन एक में ठोकर खाई है जिसे मैंने कल तक दस्तावेज देखने के लिए नहीं देखा है। मेरे पास कोड, बस वीएस, एमएसबिल्ड कमांड लाइन, सबकुछ से मेरी मशीन पर ठीक काम कर रहा था, लेकिन यह बिल्ड सर्वर (.NET 3.5 RTM चल रहा है) पर असफल रहा।एक्सएमएलएसरियललाइज़र .NET 3.5 SP1

[XmlRoot("foo")] 
public class Foo 
{ 
    static void Main() 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(Foo)); 

     string xml = @"<foo name='ack' />"; 
     using (StringReader sr = new StringReader(xml)) 
     { 
      Foo foo = serializer.Deserialize(sr) as Foo; 
     } 
    } 

    [XmlAttribute("name")] 
    public string Name { get; set; } 

    public Foo Bar { get; private set; } 
} 

एसपी 1 में, उपर्युक्त कोड ठीक है। आरटीएम में, आपको एक अवैधऑपरेशन अपवाद प्राप्त होता है:

अस्थायी कक्षा (परिणाम = 1) उत्पन्न करने में असमर्थ। त्रुटि CS0200: संपत्ति या इंडेक्सर 'ConsoleApplication2.Foo.Bar' के लिए आवंटित नहीं किया जा सकता है - यह केवल

बेशक

पढ़ा जाता है, सभी कि यह RTM के अंतर्गत चलाने के बार में [XmlIgnore] जोड़ रहा है बनाने के लिए आवश्यक है संपत्ति।

मेरा Google फू स्पष्ट रूप से इन प्रकार के परिवर्तनों के दस्तावेज़ीकरण को खोजने के लिए नहीं है। क्या वहां कोई परिवर्तन सूची है जो इस परिवर्तन को सूचीबद्ध करती है (और समान अंडर-द-हूड परिवर्तन जो कूद सकता है और "गॉचा" चिल्ला सकता है)? क्या यह बग है या ये कोई विशेषता है?

संपादित: SP1 में, अगर मैं एक <Bar /> तत्व, या सेट [XmlElement] बार संपत्ति के लिए, यह deserialized नहीं किया जाएगा जोड़ा। जब यह deserialize करने की कोशिश करता है यह प्री-एसपी 1 में विफल नहीं होता है - XmlSerializer का निर्माण होने पर यह एक अपवाद फेंकता है।

इससे मुझे एक बग होने की ओर अधिक दुबला बना दिया जाता है, खासकर यदि मैं Foo.Bar के लिए एक [XmlElement] विशेषता सेट करता हूं। अगर मैं ऐसा करने में असमर्थ हूं जो मैं इसे करने के लिए कहता हूं, तो इसे चुपचाप Foo.Bar को अनदेखा करने के बजाय अपवाद फेंकना चाहिए। एक्सएमएल क्रमबद्धता विशेषताओं के अन्य अमान्य संयोजन/सेटिंग्स के परिणामस्वरूप अपवाद होता है।

संपादित करें: धन्यवाद, टोनीबी, मैं temp फ़ाइलों को स्थान सेट करने के बारे में नहीं जानता। उत्पन्न क्रमबद्धता विधानसभा में

<system.diagnostics> 
    <switches> 
    <add name="XmlSerialization.Compilation" value="1" /> 
    </switches> 
</system.diagnostics> 
<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

यहां तक ​​कि एक [XmlElement] बार संपत्ति पर विशेषता सेटिंग के साथ, कोई जिक्र नहीं इसके बारे में किया गया था: उन है कि भविष्य में इसी तरह के मुद्दों के पार चलो के लिए, आप एक अतिरिक्त config ध्वज की ज़रूरत है - जो काफी दृढ़ता से इसे चुपचाप निगलने वाले त्रुटि (उर्फ, एक बग) के दायरे में रखता है। या तो डिजाइनरों ने निर्णय लिया है [XmlIgnore] अब उन गुणों के लिए जरूरी नहीं है जिन्हें सेट नहीं किया जा सकता है - और आप रिलीज नोट्स, change lists, या XmlIgnoreAttribute documentation में देख सकते हैं।

उत्तर

4

एसपी 1 में foo.Bar संपत्ति ठीक से deserialized मिलता है?

पूर्व एसपी 1 में आप ऑब्जेक्ट को deserialize करने में सक्षम नहीं होंगे क्योंकि बार संपत्ति की सेट विधि निजी है इसलिए XmlSerializer के पास उस मान को सेट करने का कोई तरीका नहीं है। मुझे यकीन नहीं है कि एसपी 1 इसे कैसे खींच रहा है।

आप अपने web.config को यह जोड़ने की कोशिश कर सकते/app.config

<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

कि वर्ग सी में XmlSerializer द्वारा उत्पन्न रखा जाएगा: \ foo ताकि आप देख सकते हैं कि यह बनाम SP1 में क्या कर रहा है आरटीएम

+1

यह समस्या को ठीक करने के लिए प्रतीत नहीं होता है .NET 4 – Levitikon

0

मुझे यह नया (?) व्यवहार पसंद है क्योंकि XML दस्तावेज़ में बार का कोई उल्लेख नहीं है, इसलिए deserializer को इसे सेट करने का भी प्रयास नहीं करना चाहिए।

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