2012-04-03 63 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项空值。

编辑:

有人发现了它的工作原理与此MYLIST构造:

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

现在deTestList cointains正确的数据。

但当我尝试这个办法:

 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项空的。 我不明白。

回答

1

根本不需要执行ISerializable,只需将Serializable属性放在类上(除非需要自定义序列化行为)。它工作正常,你这样做(但我不知道为什么它不适用于您当前的代码...)

+0

类有另一个变量,我没有在示例代码中显示,我需要自定义序列化为他们的行为,所以我需要实现ISerializable。 – 2012-04-03 09:57:01

+0

哪个类,MyList或SomeData?它似乎工作,如果只有其中一个实现ISerializable ... – 2012-04-03 09:58:16

+0

他们都需要实现ISerializable。 – 2012-04-03 10:03:24