2009-10-29 1 views
16

I XMLSerializer bin mit der Serialisierung eines Objekts, das eine generische ListeXmlSerializer verwenden zu abgeleiteten Klassen serialisiert

List <ChildBase> Children {get;set}

Das Problem enthält, ist, dass jedes Element aus ChildBase leitet sich in der Tat, die eine abstrakte Klasse ist. Wenn ich versuche, deserialize, bekomme ich eine ungültigeOperationException

Gibt es eine Möglichkeit, XMLSerializer mit abgeleiteten Objekten zu verwenden? Danke.

Antwort

39

Es gibt drei Möglichkeiten, dies zu tun; entweder können Sie [XmlInclude] gegen den Typ verwenden, oder Sie können XmlElement/XmlArrayItem gegen die Eigenschaft verwenden. Sie sind alle unten gezeigt; Kommentieren Sie das von Ihnen bevorzugte Paar:

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 
public class MyWrapper { 
    //2: [XmlElement("A", Type = typeof(ChildA))] 
    //2: [XmlElement("B", Type = typeof(ChildB))] 
    //3: [XmlArrayItem("A", Type = typeof(ChildA))] 
    //3: [XmlArrayItem("B", Type = typeof(ChildB))] 
    public List<ChildClass> Data { get; set; } 
} 
//1: [XmlInclude(typeof(ChildA))] 
//1: [XmlInclude(typeof(ChildB))] 
public abstract class ChildClass { 
    public string ChildProp { get; set; } 
} 
public class ChildA : ChildClass { 
    public string AProp { get; set; } 
} 
public class ChildB : ChildClass { 
    public string BProp { get; set; } 
} 
static class Program { 
    static void Main() { 
     var ser = new XmlSerializer(typeof(MyWrapper)); 
     var obj = new MyWrapper { 
      Data = new List<ChildClass> { 
       new ChildA { ChildProp = "abc", AProp = "def"}, 
       new ChildB { ChildProp = "ghi", BProp = "jkl"}} 
     }; 
     ser.Serialize(Console.Out, obj); 
    } 
} 
+0

Und jetzt versuchen Sie, dies anzuwenden: [XmlRoot (ElementName = "myWrapper", Namespace = "http: // URL /")] öffentliche Klasse MyWrapper –

+0

danke! Ich habe meinen Kopf gegen eine Ziegelmauer geschlagen und versucht, das herauszufinden. – iagomartinez

+0

Was für eine großartige Antwort – sjclark76

5

Sie können dafür XmlIncludeAttribute verwenden. Oder sehen Sie this auf einem anderen Weg, dies zu tun.

+0

Fehlende [diesen] Link? –

+0

Danke. Korrigiert. –

+1

Das hat es getan. Vielen Dank. –