2010-05-24 10 views
16

Tengo un problema con el que me he estado golpeando la cabeza durante la mayor parte de las tres horas. Estoy casi seguro de que me he perdido algo salta a la vista ...¿Por qué OnDeserialization no se activa para la deserialización de XML?

que tienen un simple archivo 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> 

que tienen una estructura de clases sencilla:

[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"); 
    } 
} 

estoy usando éstos tanto en código de llamada y en los archivos de clase:

using System.Xml.Serialization; 
using System.Runtime.Serialization; 

que tienen algún código de llamada:

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); 

El problema es que estoy esperando que se llame a OnDeserialized_Method, y no lo es.

Sospecho que podría tener algo que ver con el hecho de que se trata de deserialización XML en lugar de deserialización en tiempo de ejecución, y tal vez estoy usando el nombre de atributo incorrecto, pero no puedo averiguar cuál podría ser.

Cualquier idea, amigos?

Respuesta

2

La única forma en que podría hacer eso de una manera elegante es implementar manualmente IXmlSerializable, que no es divertido. Simplemente; XmlSerializer no es compatible con devoluciones de serialización.

A veces, sin embargo, puede cambiar a DataContractSerializer, que todavía ofrece capacidades xml, pero que hace admiten llamadas de serialización. Desafortunadamente las opciones XML son limitados - no va a funcionar para usted estructura XML, ya que utiliza atributos (DataContractSerializer sólo es compatible con los elementos).

También puede buscar en los comentarios sobre this answer, que discute los puntos de esta.

Cuestiones relacionadas