XmlSerializer stellt eine Herausforderung dar, wenn Objekte serialisiert werden, die generische Listen abgeleiteter Klassen enthalten. Die abstrakte Basisklassennatur dieser abgeleiteten Elemente führt während der Deserialisierung häufig zu einem InvalidOperationException
. Lassen Sie uns nach Lösungen für dieses häufige Problem suchen.
Es gibt drei wirksame Strategien, um diese Einschränkung zu überwinden:
[XmlInclude]
Attributs<code class="language-csharp">//1: [XmlInclude(typeof(ChildA))] //1: [XmlInclude(typeof(ChildB))] public abstract class ChildClass { /* ... */ }</code>
Diese Methode erfordert das Annotieren der Basisklasse (ChildClass
) mit dem Attribut [XmlInclude]
für jede einzelne abgeleitete Klasse.
[XmlElement]
oder [XmlArrayItem]
auf dem Grundstück<code class="language-csharp"> //2: [XmlElement("A", Type = typeof(ChildA))] //2: [XmlElement("B", Type = typeof(ChildB))] public List<ChildClass> Data { get; set; }</code>
Hier wird das Attribut [XmlElement]
oder [XmlArrayItem]
direkt auf die Eigenschaft angewendet, die die Liste der abgeleiteten Klassen enthält. Dadurch werden dem Serialisierer explizite Typinformationen bereitgestellt.
[XmlArrayItem]
der Immobilie<code class="language-csharp"> //3: [XmlArrayItem("A", Type = typeof(ChildA))] //3: [XmlArrayItem("B", Type = typeof(ChildB))] public List<ChildClass> Data { get; set; }</code>
Dieser Ansatz spiegelt Methode 2 wider, verwendet jedoch [XmlArrayItem]
anstelle von [XmlElement]
und bietet eine etwas andere XML-Struktur.
Jeder dieser Ansätze ermöglicht eine erfolgreiche Serialisierung und Deserialisierung von Objekten mit Listen abgeleiteter Klassen. Die optimale Wahl hängt von den spezifischen Anforderungen Ihrer Anwendung an XML-Struktur und Flexibilität ab.
Das obige ist der detaillierte Inhalt vonWie kann ich generische Listen abgeleiteter Klassen mit XmlSerializer erfolgreich serialisieren und deserialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!