Сериализация производного класса из интерфейса BindingList и ISerializable - PullRequest
2 голосов
/ 03 апреля 2012

Я получил класс от интерфейса 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 содержит правильные данные.

Но когда я попробую это:

        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 Ответ

1 голос
/ 03 апреля 2012

Вам вообще не нужно реализовывать ISerializable, вам просто нужно поместить атрибут Serializable в ваш класс (если вам не нужно настраивать поведение сериализации).Это хорошо работает, если вы делаете это (но я не уверен, почему это не работает с вашим текущим кодом ...)

...