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
Libérer: 2025-01-11 09:47:42
original
963 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal