2012-04-03 3 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.

Отредактировано:

Кто-то узнал, что он работает с этим 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. –

+0

Какой класс, MyList или SomeData? Кажется, что работает, если только один из них реализует ISerializable ... –

+0

Оба они должны реализовать ISerializable. –

 Смежные вопросы

  • Нет связанных вопросов^_^