2009-10-29 17 views
16

sto utilizzando XmlSerializer per serializzare un oggetto che contiene un elenco genericoUtilizzando XmlSerializer per serializzare classi derivate

List <ChildBase> Children {get;set}

Il problema è che ogni elemento deriva dalla ChildBase che di fatto è una classe astratta. Quando provo a deserializzare, ottengo un invalidOperationException

Esiste un modo per utilizzare XMLSerializer con oggetti derivati? Grazie.

risposta

39

Ci sono tre modi per farlo; o è possibile utilizzare [XmlInclude] contro il tipo, oppure è possibile utilizzare XmlElement/XmlArrayItem contro la proprietà. Sono tutti mostrati di seguito; decommenta la coppia che preferisci:

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

E ora prova ad applicare questo: [XmlRoot (ElementName = "myWrapper", Namespace = "http: // URL /")] classe pubblica MyWrapper –

+0

grazie! Ho sbattuto la testa contro un muro di mattoni cercando di capirlo. – iagomartinez

+0

Che ottima risposta – sjclark76

5

Per questo è possibile utilizzare XmlIncludeAttribute. Oppure vedi il post this su un altro modo per farlo.

+0

Manca [questo] link? –

+0

Grazie. Corretto. –

+1

Questo l'ha fatto. Grazie. –

Problemi correlati