2012-04-03 7 views
2

Ich habe Klasse von BindingList und ISerializable-Schnittstelle abgeleitet. Ich möchte diese Klasse (binär) serialisieren, aber ich kann ihre Elemente nicht serialisieren.Serialisierung abgeleiteter Klasse von BindingList und ISerializable-Schnittstelle

Beispielcode:

[Serializable] 
    sealed class SomeData : ISerializable 
    { 
     private string name; 

     public SomeData(string name) 
     { 
      this.name = name; 
     } 

     private SomeData(SerializationInfo info, StreamingContext ctxt) 
     { 
      name = info.GetString("Name"); 
     } 

     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      info.AddValue("Name", name); 
     } 
    } 

    [Serializable] 
    class MyList : BindingList<SomeData>, ISerializable 
    { 
     public MyList() 
     { 
     } 

     private MyList(SerializationInfo info, StreamingContext ctxt) 
     { 
      ((List<SomeData>)this.Items).AddRange((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>))); 
     } 

     public void GetObjectData(SerializationInfo info, StreamingContext context) 
     { 
      info.AddValue("Items", (List<SomeData>)this.Items); 
     } 
    } 

Jetzt, wenn ich versuche, es zu serialisieren. Zum Beispiel so:

 MyList testList = new MyList(); 
     testList.Add(new SomeData("first")); 
     testList.Add(new SomeData("second")); 
     testList.Add(new SomeData("third")); 

     MemoryStream stream = new MemoryStream(); 
     BinaryFormatter formatter = new BinaryFormatter(); 

     formatter.Serialize(stream, testList); 
     stream.Seek(0, SeekOrigin.Begin); 

     MyList deTestList = (MyList)formatter.Deserialize(stream); 

deTestList enthält 3 Einträge von null.

Edited:

Jemand fand heraus, dass es mit diesem MyList Konstruktor funktioniert:

 private MyList(SerializationInfo info, StreamingContext ctxt) 
      : base((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>))) 
     { 
     } 

Jetzt deTestList cointains korrekten Daten.

Aber wenn ich versuche dies:

 private MyList(SerializationInfo info, StreamingContext ctxt) 
      : base((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>))) 
     { 
      ((List<SomeData>)this.Items).AddRange((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>))); 
     } 

deTestList 6 Artikel von null enthält. Ich verstehe es nicht.

Antwort

1

Sie müssen ISerializable überhaupt nicht implementieren, Sie müssen nur das Attribut Serializable auf Ihre Klasse setzen (außer Sie müssen das Serialisierungsverhalten anpassen). Es funktioniert gut in dir tun (aber ich bin mir nicht sicher, warum es nicht mit Ihrem aktuellen Code funktioniert ...)

+0

Klasse haben eine andere Variablen, die ich nicht im Beispielcode zeigen, und ich muss die Serialisierung anpassen Verhalten für sie, also muss ich ISerializable implementieren. –

+0

Welche Klasse, MyList oder SomeData? Es scheint zu funktionieren, wenn nur einer von ihnen ISerializable implementiert ... –

+0

Beide müssen ISerializable implementieren. –

Verwandte Themen