Frage

Ich habe eine benutzerdefinierte abstrakte Basisklasse mit Unterklassen, die ich gemacht habe serializable / deseriablizeable mit ISerializable. Wenn ich die Serialisierung / Deserialisierung von einzelnen Instanzen dieser Klasse Unterklassen zu tun, funktioniert alles einwandfrei. Allerdings, wenn ich eine Reihe von ihnen habe ich immer mit einer Reihe von Nullen auf Deserialisierung enden. Serialisierung erfolgt mit BinaryFormatter.

Die Elemente enthalten sind, innerhalb eines:

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

Auf Serialisierung dies in GetObjectData auf dem SerializationInfo erfolgt über die Parameter:

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

Und auf Deserialisierung dies in der Serialisierung Konstruktor getan wird auch auf dem SerializationInfo Parameter:

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

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

Deserialisierung gibt mir immer eine Reihe von Nullen und wie ich bereits erwähnt, ein einzelnes Element serialisiert und deseriaizes ganz gut mit diesem Code:

Serialisierung (GetObjectData-Methode):

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

Deserialisierung (Serialisierung Constructor):

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

Ist das ein weit verbreitetes Problem? Ich scheine, um es zumindest keine Vorkommen von jemand anderem Laufen zu finden. Hoffentlich gibt es eine Lösung :) und wenn ich brauche Sie weitere Informationen / Code liefern mir nur sagen.

Danke!

War es hilfreich?

Lösung

Array deserialisiert zuerst. Dann werden alle inneren Deserialisierung erfolgt. Also, wenn Sie den Zugriff auf Elemente versuchen, sie sind null.

Und Idee Verwendung [OnDeserialized] Attribut auf ein bestimmtes Verfahren, das alle anderen properies aufbaut. Und hier ist Beispiel:

[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());
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top