2009-10-29 15 views
16

estoy usando XMLSerializer para serializar un objeto que contiene una lista genéricaUsando XmlSerializer para serializar clases derivadas

List <ChildBase> Children {get;set}

El problema es que cada elemento se deriva de ChildBase que de hecho es una clase abstracta. Cuando intento deserializar, obtengo una invalidOperationException

¿Hay alguna manera de poder usar XMLSerializer con objetos derivados? Gracias.

Respuesta

39

Hay tres formas de hacerlo; o bien puede usar [XmlInclude] contra el tipo, o puede usar XmlElement/XmlArrayItem contra la propiedad. Todos se muestran abajo; elimine el par que prefiera:

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

Y ahora intente aplicar esto: [XmlRoot (ElementName = "myWrapper", Namespace = "http: // URL /")] public class MyWrapper –

+0

¡gracias! estado golpeando mi cabeza contra una pared de ladrillos tratando de resolver esto. – iagomartinez

+0

Qué gran respuesta – sjclark76

5

Puede usar XmlIncludeAttribute para esto. O vea this publicación en otra forma de hacerlo.

+0

Falta el enlace [este]? –

+0

Gracias. Corregido –

+1

Eso lo hizo. Gracias. –

Cuestiones relacionadas