2010-12-02 3 views
7

Ich habe eine benutzerdefinierte abstrakte Basisklasse mit Subklassen, die ich serializable/deseriablizeable mit ISerializable gemacht habe. Bei der Serialisierung/Deserialisierung einzelner Instanzen der Unterklassen dieser Klasse funktioniert alles einwandfrei. Wenn ich jedoch ein Array von ihnen mache, habe ich immer eine Reihe von Nullen bei der Deserialisierung. Serialisierung erfolgt mit BinaryFormatter.Deserialisierung eines Arrays gibt immer ein Array von Nullen

Die Elemente werden in einem enthalten sind:

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

Auf Serialisierung dies in GetObjectData auf dem SerializationInfo Parameter erfolgt:

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

Und auf Deserialisierung dieser in der Serialisierung Konstruktor auf das auch getan wird SerializationInfo-Parameter:

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

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

Des erialization gibt mir immer eine Reihe von Nullen und wie ich bereits erwähnt, kann 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 häufiges Problem? Ich finde anscheinend keine Vorkommnisse von irgendjemand anderem, der dazu rennt. Hoffentlich gibt es eine Lösung :) und wenn ich Sie mit mehr Informationen/Code versorgen muss, sagen Sie es mir einfach.

Danke!

+0

Hallo, was ist Info Variable? Was ist das Format der Serialisierung? Xml oder binär? –

+1

ist es die SerializationInfo, die ich in der GetObjectData und der Serialization-Konstruktor verwenden, sollte dies erwähnt haben. – vesz

+0

http://stackoverflow.com/questions/126155/c-array-xml-serialization Irgendwelche Hilfe? – Polity

Antwort

9

Array deserialisiert zuerst. Dann ist die gesamte innere Deserialisierung abgeschlossen. Wenn Sie also versuchen, auf Objekte zuzugreifen, sind sie null.

Und Idee zu verwenden [OnDeserialized] Attribut auf eine Methode, die alle anderen Eigenschaften aufbaut. Und hier ist ein 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()); 
    } 
} 
+0

Ich werde versuchen, es ein wenig mehr und liefern mehr Code in meiner Frage. Ich mache tatsächlich Serialisierung auf einer Klasse, die dieses Array von serialisierbaren Objekten enthält. Eine Alternative ist die Serialisierung des gesamten Arrays mit verschiedenen Namen in SerializationInfo. "trade1" usw. – vesz

+0

Aktualisierte Antwort, jetzt sollte dies helfen) –

+0

Testen Sie es jetzt, gib mir eine Sekunde. Du bist zu schnell :) Ich habe nicht einmal mein neues Testprojekt fertiggestellt: D – vesz

Verwandte Themen