Domanda

Ho una classe base astratta personalizzato con le sottoclassi che ho fatto serializable / deseriablizeable con ISerializable. Quando faccio la serializzazione / deserializzazione di singole istanze di classi sotto questa classe, tutto funziona bene. Tuttavia, quando faccio un array di loro ho sempre finiscono con una serie di valori nulli sul deserializzazione. La serializzazione è fatto con BinaryFormatter.

Gli elementi sono contenuti all'interno di una:

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

Su serializzazione questo viene fatto in GetObjectData sul parametro SerializationInfo:

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

E su deserializzazione questo viene fatto nel costruttore di serializzazione anche sul parametro SerializationInfo:

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

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

deserializzazione mi dà sempre una matrice di valori nulli e come ho già detto in precedenza, un singolo elemento serializza e deseriaizes bene con questo codice:

La serializzazione (metodo GetObjectData):

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

deserializzazione (serializzazione Constructor):

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

E 'questo un problema comune? Mi sembra di non trovare le occorrenze di chiunque altro in esecuzione per almeno. Speriamo che ci sia una soluzione :) e se ho bisogno di fornirvi ulteriori informazioni / code dimmi solo.

Grazie!

È stato utile?

Soluzione

Array deserializza prima. Poi tutto deserializzazione interno è fatto. Così, quando si tenta di accedere agli elementi, sono nulli.

E idea di utilizzare [OnDeserialized] attributo qualche metodo, che si accumula tutte le altre properies. Ed ecco esempio:

[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());
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top