Ho un problema a cui mi sono battuto per la parte migliore di tre ore. Sono quasi certo che ho perso qualcosa assolutamente ovvio ...Perché OnDeserialization non viene attivato per la deserializzazione XML?
Ho un semplice file XML:
<?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>
Ho una semplice struttura di 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");
}
}
sto usando questi sia in codice chiamante e nei file di classe:
using System.Xml.Serialization;
using System.Runtime.Serialization;
ho qualche codice chiamante:
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);
Il problema è che mi aspetto che OnDeserialized_Method venga chiamato, e non lo è.
Sospetto che potrebbe avere qualcosa a che fare con la deserializzazione XML piuttosto che con la deserializzazione in runtime, e forse sto usando il nome dell'attributo sbagliato, ma non riesco a scoprire quale potrebbe essere.
Qualche idea, gente?
Darn. È molto fastidioso Oh bene. Ho aggiunto una soluzione alternativa a un campo che non viene impostato quando deserializzo e impostato nuovamente quando lo stato interno è buono. – Jonathan