La sérialisation des Listes de Classes XML
J'ai une collection de classes que je veux pour sérialiser un fichier XML. Il ressemble à quelque chose comme ceci:
public class Foo
{
public List<Bar> BarList { get; set; }
}
Où un bar est juste un wrapper pour une collection de propriétés, comme ceci:
public class Bar
{
public string Property1 { get; set; }
public string Property2 { get; set; }
}
Je veux marquer cette sorte qu'il génère un fichier XML utilisé pour la persistance, et aussi pour rendre les paramètres via une transformation XSLT pour une belle forme lisible par l'homme.
Je veux obtenir une belle représentation XML comme ceci:
<?xml version="1.0" encoding="utf-8"?>
<Foo>
<BarList>
<Bar>
<Property1>Value</Property1>
<Property2>Value</Property2>
</Bar>
<Bar>
<Property1>Value</Property1>
<Property2>Value</Property2>
</Bar>
</Barlist>
</Foo>
où sont tous les Bars de la Barlist sont écrites avec l'ensemble de leurs propriétés. Je suis assez sûr que je vais avoir besoin de certaines marques dans la définition de classe pour le faire fonctionner, mais je n'arrive pas à trouver la bonne combinaison.
J'ai marqué Foo avec l'attribut
[XmlRoot("Foo")]
et la list<Bar>
avec l'attribut
[XmlArray("BarList"), XmlArrayItem(typeof(Bar), ElementName="Bar")]
dans une tentative de dire le Sérialiseur ce que je veux. Cela ne semble pas fonctionner, cependant, et je viens d'obtenir une balise vide, à la recherche comme ceci:
<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Barlist />
</Foo>
Je ne sais pas si le fait que je suis en utilisant Automatique des Propriétés devrait avoir aucun effet, ou si l'utilisation de médicaments génériques nécessite aucun traitement particulier. J'ai eu à travailler avec des types simples comme une liste de chaînes de caractères, mais une liste de classes jusqu'à présent m'échappe.
Vous devez vous connecter pour publier un commentaire.
Juste pour vérifier, avez-vous marqué Bar [Serializable]?
Aussi, vous avez besoin d'un paramètre moins ctor sur la Barre, pour désérialiser
Hmm, j'ai utilisé:
Et qui a produit:
[Serializable]
n'est pas utilisé par le Sérialiseur XML.Tout ce qui ressemble beaucoup. Comme @Carl dit que vous devez ajouter le [Serializable] attribut des classes, mais d'autres que votre création XML doit trouver du travail.
Foo
Bar
Code pour tester
Sortie
[Serializable]
n'est pas utilisé par le Sérialiseur XML.Il a été de plus de 5 ans depuis que cet article a été posté. Je donne mon expérience à partir de juillet 2013 (.NET Framework 4.5). Pour ce que ça vaut, et à qui cela peut concerner:
Quand j'définir une classe comme ça: (VB.Net code)
Avec cette définition de la classe est (de)sérialisé sans aucun problème. C'est le XML qui vient d'ici:
Il ne m'a fallu deux jours pour comprendre que la solution était de laisser les
<XmlElement>
préfixe de la Liste(de T) éléments.