2012-04-03 5 views
2

BindingListおよびISerializableインターフェイスからクラスを派生しました。私は(バイナリ)このクラスをシリアル化したいが、私はその項目をシリアル化することができません。BindingListおよびISerializableインターフェイスから派生クラスをシリアライズ

サンプルコード:

[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); 
     } 
    } 

は今、私はそれをシリアル化しようとします。たとえば、次のようになります。

 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には3つのnullが含まれています。

編集:

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

今deTestList cointains正しいデータ:

誰かが、それはこのMYLISTコンストラクタで動作することがわかりました。

しかし、私はこのしようとすると:

 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がnullの6つの項目が含まれています。 私はそれを理解していません。

答えて

1

ISerializableを実装する必要はありません。シリアル化の動作をカスタマイズする必要がない場合は、Serializable属性をクラスに追加するだけです。それは正常に動作します(しかし、私はあなたの現在のコードではうまくいかないのですか?)

+0

クラスにはサンプルコードでは表示されない別の変数があり、シリアル化をカスタマイズする必要がありますそのため、ISerializableを実装する必要があります。 –

+0

MyListまたはSomeDataのどちらのクラスですか?それらのうちの1つだけがISerializableを実装する場合、動作するようです... –

+0

どちらもISerializableを実装する必要があります。 –

関連する問題