Pourquoi le OnDeserialization pas le feu pour la Désérialisation XML?
J'ai un problème que j'ai été bashing ma tête contre pour le mieux partie de trois heures. Je suis presque certain que j'ai raté quelque chose saute aux yeux...
J'ai un fichier XML simple:
<?xml version="1.0" encoding="utf-8"?>
<WeightStore xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Records>
<Record actual="150" date="2010-05-01T00:00:00" />
<Record actual="155" date="2010-05-02T00:00:00" />
</Records>
</WeightStore>
J'ai une simple structure de classe:
[Serializable]
public class Record
{
[XmlAttribute("actual")] public double weight { get; set; }
[XmlAttribute("date")] public DateTime date { get; set; }
[XmlIgnore] public double trend { get; set; }
}
[Serializable]
[XmlRoot("WeightStore")]
public class SimpleWeightStore
{
[XmlArrayAttribute("Records")]
private List<Record> records = new List<Record>();
public List<Record> Records { get { return records; } }
[OnDeserialized()]
public void OnDeserialized_Method(StreamingContext context)
{
//This code never gets called
Console.WriteLine("OnDeserialized");
}
}
Je suis à l'aide de ces deux code d'appel et dans les fichiers de classe:
using System.Xml.Serialization;
using System.Runtime.Serialization;
J'ai peu de code d'appel:
SimpleWeightStore weight_store_reload = new SimpleWeightStore();
TextReader reader = new StringReader(xml);
XmlSerializer deserializer = new XmlSerializer(weight_store.GetType());
weight_store_reload = (SimpleWeightStore)deserializer.Deserialize(reader);
Le problème est que je suis dans l'attente d'OnDeserialized_Method à être appelé, et il n'est pas.
Je pense qu'elle pourrait avoir quelque chose à voir avec le fait que c'est la désérialisation XML plutôt que de l'Exécution de la désérialisation, et peut-être que je suis en utilisant le mauvais nom de l'attribut, mais je ne peux pas savoir ce que cela pourrait être.
Les idées, les gens?
OriginalL'auteur Jonathan | 2010-05-24
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas d'équivalent de
OnDeserialized
pour la désérialisation XML.Voir ce post pour les solutions de contournement: Comment avez-vous découvrez quand vous avez été chargé par la Sérialisation XML?
OriginalL'auteur Julien Lebosquain
La seule façon pour vous de le faire dans une manière élégante est de mettre en œuvre manuellement
IXmlSerializable
, qui est pas plaisir. Simplement;XmlSerializer
ne prend pas en charge la sérialisation des rappels.Parfois, cependant, vous pouvez passer à
DataContractSerializer
, qui offre encore des fonctionnalités xml mais qui ne soutien de la sérialisation des rappels. Malheureusement, les options xml sont limitée - il ne fonctionnera pas pour vous la structure xml, depuis que utilise des attributs (DataContractSerializer
prend uniquement en charge les éléments).Vous pouvez également regarder les commentaires sur cette réponse, qui porte sur les points de ce.
OriginalL'auteur Marc Gravell