2010-07-02 14 views

cevap

7

IXmlSerializable benzer senin normal XML seri çocuk türlerini seçemezsiniz verilen bir ya hep ya hiç yaklaşımı hemen hemen beri uygulamaya biraz can sıkıcı. Ancak, sizi doğru anladıysam, IXmlSerializable'u uygulamayan türler için XmlSerializer'u manuel olarak oluşturarak istediğinizi elde edebilirsiniz.

Örneğin, ve Custom uygulanmayan iki sınıfla, Default ile başlıyorsak, bunu uygular.

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(); 
    } 
} 

Sonra üçüncü sınıf önceki örneklerde her birinin bir çocuğu vardır ve onu destekleyen ve diğer çocuk için varsayılan XML seri hale oluşturmak çocuk için ReadXml/WriteXml yöntemlerini çağıran bir şekilde IXmlSerializable uygulayan Parent oluşturun. .. Ben bu deneyin üzereyim ... bu kadar

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 ama yüzeyde görünüyor:

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 ve bir Parent örneğini deserializes bir örnek program, örnek ettirmek için Tam olarak ihtiyacım olan şey .. –

+1

Küçük bir not: XmlSerializer'ı hem WriteXml()/ReadXml() yöntemlerinde Varsayılan ve Özel nesneler için kullanabilirsiniz. – synergetic

+0

Bir alt nesneyi 'XmlReader' işlevini kullanarak seri hale getirdiğinizde, okuyucu işaretçisi doğru yerde (çocuk öğesinin sonunda) bitiyor mu, yoksa gecikmeli mi? – toddmo

İlgili konular