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);
}
स्रोत
2010-07-02 17:39:05
Thx ... मैं के बारे में इस प्रयास करने के लिए कर रहा हूँ .. लेकिन यह सतह पर लगता है बिल्कुल वही होना चाहिए जो मुझे चाहिए .. –
एक छोटा सा नोट: आप XXSerializer दोनों को WriteXml()/ReadXml() विधियों में डिफ़ॉल्ट और कस्टम ऑब्जेक्ट्स के लिए उपयोग कर सकते हैं। – synergetic
जब आप बच्चे के ऑब्जेक्ट को 'एक्सएमएल रीडर' सौंपते हैं, तो क्या पाठक सूचक सही जगह पर (केवल बच्चे तत्व के अंत में) समाप्त होता है, या इसे मंद किया जाता है? – toddmo