2009-02-05 8 views
5

Ich bin de/ein Objekt wie so Serialisierung:eine generische Liste Deserialisieren null zurück

public class myClass : ISerializable 
{ 
    public List<OType> value; 

    public myClass(SerializationInfo info, StreamingContext context) 
    { 
    this.value = (List<OType>)info.GetValue("value", typeof(List<OType>)); 
    } 

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
    info.AddValue("value", value, typeof(List<OType>)); 
    } 
} 

Das Objekt, das in der Liste ist tut das Attribut Serializable haben. Beim Serialisieren werden keine Fehler ausgegeben und die Liste ist nie leer, aber beim Deserialisieren sind alle meine Listen null und ich bin mir nicht sicher warum.

Ich markiere dies als beantwortet von CQ. Ich konnte eine kleine One-Off-Test-App erstellen, die mit den Objekten, die ich verwenden möchte, richtig serialisiert/deserialisiert wird, aber ich kann es immer noch nicht in meinem Produktionscode verwenden, aber ich vermute, dass es etwas Kleines ist Ich vermisse.

+0

Vielleicht ist OType nicht serialisierbar? – hova

+0

Ich habe ein ähnliches Problem: http://StackOverflow.com/Questions/1097797 –

Antwort

3

Nun, die Liste ist immer leer, beginnen Sie mit der Einstellung über myClass.value = new List<...>();? Haben Sie die serialisierten Daten auch im Binär- und XML-Format gespeichert, damit Sie überprüfen können, ob die Daten tatsächlich gespeichert werden?

Nur noch eine Anmerkung, wenn Sie 2.0+ verwenden, müssen Sie ISerializable nicht implementieren, wenn Sie die absolute Serialisierung nicht steuern müssen, können Sie den Wert in eine öffentliche Eigenschaft ändern und serialisieren besitzen.

Edit: Der folgende Fall scheint zu serialisieren und deserialize gut für mich, ich posten dies incase Ich missverstanden die Frage als Ganzes.

Den fiesen Testcode zu ignorieren, hoffentlich hilft das ein wenig.

[Serializable] 
    public class OType 
    { 
     public int SomeIdentifier { get; set; } 
     public string SomeData { get; set; } 

     public override string ToString() 
     { 
      return string.Format("{0}: {1}", SomeIdentifier, SomeData); 
     } 
    } 

    [Serializable] 
    public class MyClass : ISerializable 
    { 
     public List<OType> Value; 

     public MyClass() { } 

     public MyClass(SerializationInfo info, StreamingContext context) 
     { 
      this.Value = (List<OType>)info.GetValue("value", typeof(List<OType>)); 
     } 

     void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      info.AddValue("value", Value, typeof(List<OType>)); 
     } 
    } 

... 

     var x = new MyClass(); 

     x.Value = new OType[] { new OType { SomeIdentifier = 1, SomeData = "Hello" }, new OType { SomeIdentifier = 2, SomeData = "World" } }.ToList(); 

     var xSerialized = serialize(x); 

     Console.WriteLine("Serialized object is {0}bytes", xSerialized.Length); 

     var xDeserialized = deserialize<MyClass>(xSerialized); 

     Console.WriteLine("{0} {1}", xDeserialized.Value[0], xDeserialized.Value[1]); 

den Ausgang vergessen ..

serialisierten Objekt 754bytes

1: Hallo 2: World

+0

Ich muss iserializable implementieren, weil ich einige Bitmaps serialisieren (nicht abgebildet) und Sie können nicht einfach eine Bitmap serialisieren, ohne eine GDI Fehler. Wie ich schon sagte, die Liste ist _never_ leer. Außerdem: Ich habe die Daten nicht im XML-Format serialisiert. Will hineinschauen. –

4

Wenn Sie sagen, dass Ihre Liste null ist, tun Sie bedeuten dass die Liste selbst null ist oder dass sie mit Null-Werten gefüllt ist? Wenn letzteres, dann ist dies ein bekanntes .Net-Problem: siehe my question zum gleichen Problem.

Grundsätzlich werden List<T> s nur initialisiert, wenn sie desiralisiert werden; Die Objekte, die sie enthalten, werden nur deserialisiert, nachdem das Objektdiagramm deserialisiert wurde. Eine Möglichkeit besteht darin, einen Code, der sie benötigt, in eine OnDeserialized-Methode oder einen mit einer [OnDeserializedAttribute] einzufügen. Siehe MSDN.

Verwandte Themen