Maison >développement back-end >C++ >Comment puis-je sérialiser une liste de types dérivés d'une classe de base abstraite à l'aide de XmlSerializer ?

Comment puis-je sérialiser une liste de types dérivés d'une classe de base abstraite à l'aide de XmlSerializer ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-11 09:47:42961parcourir

How Can I Serialize a List of Abstract Base Class's Derived Types Using XmlSerializer?

Utilisez XmlSerializer pour sérialiser les classes dérivées

La sérialisation d'objets contenant des listes génériques de classes de base abstraites peut présenter des défis lors de l'utilisation de XmlSerializer. Cet article explique comment résoudre ce problème.

Question :

Un objet contenant une liste de classes dérivées (List), où la classe dérivée est abstraite et peut provoquer une InvalidOperationException pendant le processus de désérialisation.

Solution :

Afin de réussir à sérialiser un objet dérivé, trois méthodes peuvent être utilisées :

  1. Utiliser [XmlInclude] : Cet attribut vous permet de spécifier les types dérivés à inclure lors de la sérialisation. Convient aux situations où le nombre de types dérivés est faible.
  2. Utilisation de XmlElement/XmlArrayItem : Ces propriétés vous permettent de spécifier directement le type dérivé associé à la propriété. Plus adapté aux situations où le nombre de types dérivés est important.

Exemple de code :

Le code suivant illustre trois méthodes :

<code class="language-csharp">using System;
using System.Collections.Generic;
using System.Xml.Serialization;

// 方法一:使用 [XmlInclude]
[XmlInclude(typeof(ChildA))]
[XmlInclude(typeof(ChildB))]
public abstract class ChildClass {
    public string ChildProp { get; set; }
}

// 方法二:使用 XmlElement
public class MyWrapper {
    [XmlElement("ChildA", Type = typeof(ChildA))]
    [XmlElement("ChildB", Type = typeof(ChildB))]
    public List<ChildClass> Data { get; set; }
}

// 方法三:使用 XmlArrayItem
public class MyWrapper2 {
    [XmlArrayItem("ChildA", Type = typeof(ChildA))]
    [XmlArrayItem("ChildB", Type = typeof(ChildB))]
    public List<ChildClass> Data { get; set; }
}

public class ChildA : ChildClass {
    public string AProp { get; set; }
}

public class ChildB : ChildClass {
    public string BProp { get; set; }
}</code>

En décommentant les paires d'attributs requises, vous pouvez choisir la solution la mieux adaptée à vos besoins.

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