【问题标题】:Serializing derived class from BindingList and ISerializable interface从 BindingList 和 ISerializable 接口序列化派生类
【发布时间】:2012-04-16 22:08:27
【问题描述】:

我从 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 包含正确的数据。

但是当我尝试这个时:

        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 项 null。 没看懂。

【问题讨论】:

    标签: c# serialization bindinglist


    【解决方案1】:

    你根本不需要实现ISerializable,你只需要在你的类上加上Serializable属性(除非你需要自定义序列化行为)。它在你这样做时效果很好(但我不确定为什么它不适用于你当前的代码......)

    【讨论】:

    • 类还有另一个变量,我没有在示例代码中显示,我需要为它们自定义序列化行为,所以我需要实现 ISerializable。
    • 哪个类,MyList 还是 SomeData?如果只有其中一个实现 ISerializable 似乎可以工作......
    • 两者都需要实现ISerializable。
    • 奇怪...我可以看到 SomeData 对象已正确反序列化,但只有 列表已被反序列化...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-05-25
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多