2010-07-02 10 views
6

तो कस्टम एक्सएमएल क्रमबद्धता (IXmlSerialiable) का उपयोग कर एक जटिल वस्तु है कि घटक जटिल वस्तुओं जो कर नहीं कस्टम IXmlSerializable इंटरफेस, आप कैसे निर्दिष्ट करूँ का उपयोग के साथ गुण होता है पर, IXmlSerializable.ReadXml(XmlReader reader) में विधि, कि आप deserializer उन बच्चों की संपत्तियों पर सामान्य deserialization का उपयोग करना चाहते हैं?जटिल वस्तु ग्राफ पर IXmlSerializable इंटरफ़ेस का उपयोग करना

नोट: this question

उत्तर

7

IXmlSerializable के समान यह बहुत ज्यादा एक सब कुछ या कुछ दिया है कि आप सामान्य एक्सएमएल क्रमबद्धता के लिए बच्चे प्रकार का चयन नहीं कर सकते हैं दृष्टिकोण है, क्योंकि लागू करने के लिए एक सा कठिन है। हालांकि, अगर मैं आपको सही ढंग से समझता हूं तो IXmlSerializable को लागू नहीं करने वाले प्रकारों के लिए मैन्युअल रूप से XmlSerializer बनाकर आप जो चाहते हैं उसे प्राप्त कर सकते हैं।

उदाहरण के लिए, यदि हम दो कक्षाओं, Default से शुरू करते हैं जो IXmlSerializable और Custom लागू नहीं करता है जो इसे कार्यान्वित करता है।

public class Default // Uses default XML Serialization 
{ 
    public int Count { get; set; } 
} 

public class Custom : IXmlSerializable 
{ 
    public int Count { get; set; } 

    public XmlSchema GetSchema() { throw new NotImplementedException(); } 

    public void ReadXml(XmlReader reader) 
    { 
     reader.ReadToDescendant("Count"); 
     this.Count = reader.ReadElementContentAsInt(); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteStartElement("Custom"); 
     writer.WriteElementString("Count", this.Count.ToString()); 
     writer.WriteEndElement(); 
    } 
} 

फिर हम एक तृतीय श्रेणी के Parent पिछले उदाहरणों में से प्रत्येक का एक बच्चा है और एक तरह से है कि बच्चे है कि यह समर्थन करता है और दूसरे बच्चे के लिए डिफ़ॉल्ट एक्सएमएल serializer बनाने के लिए ReadXml/WriteXml तरीकों कॉल में IXmlSerializable लागू करता है कि पैदा करते हैं।

public class Parent : IXmlSerializable 
{ 
    public Parent() 
    { 
     this.Default = new Default { Count = 1 }; 
     this.Custom = new Custom { Count = 2 }; 
    } 

    public Default Default { get; set; } 
    public Custom Custom { get; set; } 

    public XmlSchema GetSchema() { throw new NotImplementedException(); } 

    public void ReadXml(XmlReader reader) 
    { 
     reader.ReadToFollowing("Custom"); 
     this.Custom = new Custom(); 
     this.Custom.ReadXml(reader); 

     reader.ReadToFollowing("Default"); 
     var serializer = new XmlSerializer(typeof(Default)); 
     this.Default = (Default)serializer.Deserialize(reader); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     this.Custom.WriteXml(writer); 

     var ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 
     new XmlSerializer(typeof(Default)).Serialize(writer, this.Default, ns); 
    } 
} 

उदाहरण पूरा, एक नमूना कार्यक्रम जो serializes और एक Parent उदाहरण deserializes करने के लिए: इतना

static void Main() 
{ 
    var sb = new StringBuilder(); 
    var serializer = new XmlSerializer(typeof(Parent)); 

    serializer.Serialize(new StringWriter(sb), new Parent()); 

    Console.WriteLine(sb); 

    var parent = (Parent)serializer.Deserialize(new StringReader(sb.ToString())); 

    Console.WriteLine("Parent.Custom.Count: {0}", parent.Custom.Count); 
    Console.WriteLine("Parent.Default.Count: {0}", parent.Default.Count); 
} 
+0

Thx ... मैं के बारे में इस प्रयास करने के लिए कर रहा हूँ .. लेकिन यह सतह पर लगता है बिल्कुल वही होना चाहिए जो मुझे चाहिए .. –

+1

एक छोटा सा नोट: आप XXSerializer दोनों को WriteXml()/ReadXml() विधियों में डिफ़ॉल्ट और कस्टम ऑब्जेक्ट्स के लिए उपयोग कर सकते हैं। – synergetic

+0

जब आप बच्चे के ऑब्जेक्ट को 'एक्सएमएल रीडर' सौंपते हैं, तो क्या पाठक सूचक सही जगह पर (केवल बच्चे तत्व के अंत में) समाप्त होता है, या इसे मंद किया जाता है? – toddmo

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