c# - XmlSerializer द्वारा क्रमबद्ध मेरी सार्वजनिक संपत्ति क्यों नहीं है?




.net xml-serialization (5)

यह वह है जिसे मैंने उम्र के लिए संघर्ष किया था, इसलिए सोचा था कि मैं कहीं दस्तावेज करता हूं। (एक प्रश्न पूछने और जवाब देने के लिए क्षमा चाहते हैं।)

(सी # नेट 2.0) मेरे पास एक कक्षा थी जिसे XmlSerializer द्वारा क्रमबद्ध किया जा रहा था, मैंने एक नई सार्वजनिक संपत्ति को जोड़ा हालांकि इसे आउटपुट एक्सएमएल में शामिल नहीं किया जा रहा था।

जहां कहीं भी मुझे मिल सकता है, दस्तावेज़ों में इसका उल्लेख नहीं किया गया है, लेकिन सार्वजनिक संपत्तियों के पास एक सेट होना चाहिए और साथ ही साथ क्रमबद्ध होना चाहिए! मुझे लगता है कि ऐसा इसलिए है क्योंकि यह मानता है कि यदि आप धारावाहिक करने जा रहे हैं तो आप उसी फ़ाइल से deserialize करना चाहते हैं, तो केवल उन गुणों को क्रमबद्ध करता है जिनमें एक सेट और एक मिलता है।


आप IXmlSerializer को कार्यान्वित कर सकते हैं और मैन्युअल रूप से क्रमबद्धता कर सकते हैं, और गुणों को क्रमबद्ध करने से लाभ प्राप्त कर सकते हैं, और इसके विपरीत, रचनाकारों / निजी फ़ील्ड असाइनमेंट का उपयोग करके उन्हें deserializing।


और यदि आपकी कक्षा में एक सूची विरासत में है और इसके अपने सदस्य भी हैं, तो केवल सूची के तत्वों को क्रमबद्ध किया जाता है। आपके वर्ग के सदस्यों में मौजूद डेटा कैद नहीं किया गया है। कुछ समय लग रहा है!


जैसा कि बताया गया है, अधिकांश गुणों में गेटटर और सेटर दोनों होना चाहिए; इसका मुख्य अपवाद सूचियां है - उदाहरण के लिए:

private readonly List<Foo> bar = new List<Foo>();
public List<Foo> Bar {get { return bar; } } // works fine

जो ठीक काम करेगा; हालांकि, यदि XmlSerializer एक XmlSerializer पाता है - यह मांग करता है कि यह सार्वजनिक है; निम्नलिखित काम नहीं करेंगे:

public List<Foo> Bar {get; private set;} // FAIL

अन्य कारणों से यह क्रमबद्ध नहीं हो सकता है:

  • यह पाने और सेट के साथ सार्वजनिक नहीं है (या एक क्षेत्र के लिए readonly जाता है)
  • इसमें एक [DefaultValue] विशेषता है, और वह मान है
  • इसमें एक सार्वजनिक bool ShouldSerializeFoo() विधि है जो झूठी लौटा दी गई है
  • इसमें एक सार्वजनिक bool FooSpecified {get;set;} संपत्ति या फ़ील्ड है जो झूठी लौटा दी गई है
  • यह चिह्नित है [XmlIgnore]
  • यह चिह्नित किया गया है [Obsolete]

इनमें से कोई भी इसे क्रमबद्ध नहीं करेगा


नलिकाओं को वापस करने वाले गुण भी क्रमबद्ध नहीं हैं!


संग्रहों के क्रमिकरण के बारे में जोड़ने के लिए एक और बात:

XmlSerializer इंटरफेस के संग्रह को अनदेखा करता है!

और उसके द्वारा मेरा मतलब है अनदेखा करें । जबकि आपको एक लाइन के लिए अपवाद मिलेगा जैसे:

public IFoo Foo { get; set; }

आपको इसके लिए अपवाद नहीं मिलेगा:

public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }




xml-serialization