Pregunta

Tengo una clase base abstracta personalizada con subclases que he hecho serializable / deseriablizeable con ISerializable. Cuando hago la serialización / deserialización de casos individuales de subclases esta clase, todo funciona bien. Sin embargo, cuando hago una gran variedad de ellos siempre termino con una serie de valores nulos en la deserialización. Serialización se realiza con BinaryFormatter.

Los elementos están contenidos dentro de un:

public ObservableCollection<Trade> Trades { get; private set; }

En la serialización esto se hace en GetObjectData en el parámetro SerializationInfo:

Trade[] trades = (Trade[])Trades.ToArray<Trade>();
            info.AddValue("trades", trades);

Y en deserialización esto se hace en el constructor de serialización también en el parámetro SerializationInfo:

Trade[] trades = (Trade[])info.GetValue("trades", typeof(Trade[]));

            foreach (Trade t in trades)
            {
                Trades.Add(t);
            }

Deserialización siempre me da una serie de valores nulos y como he mencionado anteriormente, un solo elemento y serializa deseriaizes muy bien con este código:

serialización (método GetObjectData):

info.AddValue("trade", Trades.First<Trade>());

deserialización (serialización Constructor):

Trade t = (Trade)info.GetValue("trade", typeof(Trade));
            Trades.Add(t);

¿Es un problema común? Me parece que encontrar no hay ocurrencias de cualquier otra persona corriendo a por lo menos. Con suerte hay una solución :) y si necesito para suministrarle más información / código sólo dime.

Gracias!

¿Fue útil?

Solución

Array deserializa primero. A continuación, se realiza toda la deserialización interior. Así que cuando se intenta acceder a los elementos, que son nulas.

Y la idea de atribuir el uso de algún método [OnDeserialized], que se acumula todos los demás Properies. Y aquí es ejemplo:

[Serializable]
public class TestClass : ISerializable
{
    private Trade[] _innerList;
    public ObservableCollection<Trade> List { get; set; }

    public TestClass()
    { }

    [OnDeserialized]
    private void SetValuesOnDeserialized(StreamingContext context)
    {
        this.List = new ObservableCollection<Trade>(_innerList);
        this._innerList = null;
    }

    protected TestClass(SerializationInfo info, StreamingContext context)
    {
        var value = info.GetValue("inner", typeof(Trade[]));
        this._innerList = (Trade[])value;
    }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("inner", this.List.ToArray());
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top