2010-05-24 14 views
16

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?

risposta

16

Non esiste un equivalente di OnDeserialized per la deserializzazione XML.

Vedi questo post per soluzioni alternative: How do you find out when you've been loaded via XML Serialization?

+0

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

2

L'unico modo per farlo in un modo aggraziato è quello di implementare manualmente IXmlSerializable, che non è divertimento. Semplicemente; XmlSerializer non supporta i callback di serializzazione.

A volte, tuttavia, è possibile passare a DataContractSerializer, che offre ancora funzionalità xml ma che fa callback di serializzazione di supporto. Sfortunatamente le opzioni xml sono limitate - non funzionerà per te struttura xml, dal momento che utilizza attributi (DataContractSerializer supporta solo elementi).

Si potrebbe anche guardare i commenti su this answer, che discute i punti da questo.

Problemi correlati