Comment désérialiser le XML sans connaître le type à l'avance?
Dire que j'ai un couple d'objets de base comme:
[Serializable]
public class Base
{
public string Property1 { get; set; }
public int Property2 { get; set; }
}
[Serializable]
public class Sub: Base
{
public List<string> Property3 { get; set; }
public Sub():base()
{
Property3 = new List<string>();
}
}
Et je sérialiser eux comme suit:
Sub s = new Sub {Property1 = "subtest", Property2 = 1000};
s.Property3.Add("item 1");
s.Property3.Add("item 2");
XmlSerializer sFormater = new XmlSerializer(typeof(Sub));
using (FileStream fStream = new FileStream("SubData.xml",
FileMode.Create, FileAccess.Write, FileShare.None))
{
sFormater.Serialize(fStream, s);
}
Comment puis-je désérialiser, de sorte que je serai de retour la classe correcte?
Comme dans, je veux quelque chose de ce genre
XmlSerializer bFormater = new XmlSerializer(typeof (Base));
Base newBase;
using (FileStream fStream = new FileStream("BaseData.xml",
FileMode.Open, FileAccess.Read, FileShare.Read))
{
newBase = (Base) bFormater.Deserialize(fStream);
}
Sauf que je serais capable de passer d'un fichier XML pour toute la classe qui descend à partir de la Base et la classe correcte serait créé.
Je suis en train de penser que je puisse lire le nom du nœud racine du document XML et l'utilisation d'une instruction switch pour créer le bon XmlSerializer, mais je me demandais si il y avait un moyen plus simple.
source d'informationauteur Ray
Vous devez vous connecter pour publier un commentaire.
Utiliser le
[XmlInclude]
attribut sur votre classe de base pour raconter le sérialiseur XML sur les classes dérivées, de sorte qu'il peut comprendre ce qu'il faut créer. Votre dernier extrait de code devrait alors fonctionner correctement.Vous pouvez lire le fichier XML du nœud racine et au lieu d'utiliser une instruction switch, vous pouvez écrire votre code comme celui -
Je ne pense pas qu'il y a une autre manière de lire le XML, car si vous ne connaissez pas le type, vous ne pouvez pas faire quoi que ce soit.
Autant que je sache, il n'y a pas plus simple façon de le faire.
Personnellement, je préfère un plus solution générique (comme je l'ai sérialiser un lot de différentes catégories dans mon code): pour garder le nom de type sérialisé avec la valeur.
Vous pouvez prendre un coup d'oeil à cette question pour quelques détails:
Serialise de XML et de comprendre le type de l'objet sérialisé