Maison >développement back-end >C++ >Comment puis-je réussir à sérialiser et désérialiser des listes génériques de classes dérivées à l'aide de XmlSerializer ?
XmlSerializer présente un défi lors de la sérialisation d'objets contenant des listes génériques de classes dérivées. La nature abstraite de la classe de base de ces éléments dérivés entraîne souvent un InvalidOperationException
lors de la désérialisation. Explorons les solutions à ce problème courant.
Trois stratégies efficaces existent pour surmonter cette limitation :
[XmlInclude]
<code class="language-csharp">//1: [XmlInclude(typeof(ChildA))] //1: [XmlInclude(typeof(ChildB))] public abstract class ChildClass { /* ... */ }</code>
Cette méthode nécessite d'annoter la classe de base (ChildClass
) avec l'attribut [XmlInclude]
pour chaque classe dérivée.
[XmlElement]
ou [XmlArrayItem]
sur la propriété<code class="language-csharp"> //2: [XmlElement("A", Type = typeof(ChildA))] //2: [XmlElement("B", Type = typeof(ChildB))] public List<ChildClass> Data { get; set; }</code>
Ici, l'attribut [XmlElement]
ou [XmlArrayItem]
est appliqué directement à la propriété contenant la liste des classes dérivées. Cela fournit des informations de type explicites au sérialiseur.
[XmlArrayItem]
sur la propriété<code class="language-csharp"> //3: [XmlArrayItem("A", Type = typeof(ChildA))] //3: [XmlArrayItem("B", Type = typeof(ChildB))] public List<ChildClass> Data { get; set; }</code>
Cette approche reflète la méthode 2 mais utilise [XmlArrayItem]
au lieu de [XmlElement]
, offrant une structure XML légèrement différente.
Chacune de ces approches permet une sérialisation et une désérialisation réussies d'objets avec des listes de classes dérivées. Le choix optimal dépend des exigences spécifiques de votre application en matière de structure XML et de flexibilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!