Utilisation du XmlSerializer .NET via le concepteur de paramètres Visual Studio (code généré automatiquement), il est possible de sérialiser un tableau de types dérivés comme ceci:Sérialisation types dérivés - pas dans un tableau
[XmlArrayItem(Type = typeof(Square)), XmlArrayItem(Type = typeof(Triangle))]
public Shape[] Shapes;
...
Properties.Settings.Default.Save();
et cela produit XML comme
<Shape>
<Triangle>....</Triangle>
<Triangle>....</Triangle>
<Square>....</Square>
</Shape>
Mais que se passe-t-il si le type dérivé n'est pas dans un tableau (ou toute autre collection)?
Remplacement XmlArrayItem
avec XmlElement
, les éléments suivants
[XmlElement(Type = typeof(Square)), XmlElement(Type = typeof(Triangle))]
public Shape Window;
œuvres, mais produit
<Triangle>....</Triangle>
où le nom de l'élément est le type, pas le nom de la propriété, et si j'ajoute une deuxième forme:
[XmlElement(Type = typeof(Square)), XmlElement(Type = typeof(Triangle))]
public Shape Door;
[XmlElement(Type = typeof(Square)), XmlElement(Type = typeof(Triangle))]
public Shape Window;
la sérialisation échoue juste - après tout, ho w serait-il savoir sur la désérialisation quel élément XML va dans quelle propriété?
Y a-t-il un attribut qui me manque? Puis-je faire ce travail sans écrire de code pour personnaliser la sérialisation? Comment?
Le sérialiseur ne produit que la sortie unidirectionnelle sans options. Si vous voulez une sortie de type différente, vous devez générer le fichier XML en utilisant d'autres méthodes de bibliothèque réseau. – jdweng
Le problème qu'ils posent est celui d'une classe héritant d'une autre classe. Le sérialiseur ajoute un type d'attribut au fichier XML. Ils veulent que le type hérité soit un nom d'élément. – jdweng