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 ?

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 ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-11 10:35:46434parcourir

How Can I Successfully Serialize and Deserialize Generic Lists of Derived Classes Using XmlSerializer?

Sérialisation et désérialisation de listes génériques de classes dérivées avec 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.

Résoudre le problème de sérialisation/désérialisation

Trois stratégies efficaces existent pour surmonter cette limitation :

1. Utilisation de l'attribut [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.

2. Employer [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.

3. Tirer parti de [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.

Choisir la bonne approche

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn