C# 从BindingList和ISerializable接口序列化派生类
我从BindingList和ISerializable接口派生了类。我想(二进制)序列化该类,但无法序列化其项 示例代码:C# 从BindingList和ISerializable接口序列化派生类,c#,serialization,bindinglist,C#,Serialization,Bindinglist,我从BindingList和ISerializable接口派生了类。我想(二进制)序列化该类,但无法序列化其项 示例代码: [Serializable] sealed class SomeData : ISerializable { private string name; public SomeData(string name) { this.name = name; }
[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);
}
}
deTestList包含3个空项
编辑:
有人发现它与MyList构造函数一起工作:
private MyList(SerializationInfo info, StreamingContext ctxt)
: base((List<SomeData>)info.GetValue("Items", typeof(List<SomeData>)))
{
}
private MyList(SerializationInfo-info,StreamingContext-ctxt)
:base((列表)info.GetValue(“项目”,类型(列表)))
{
}
现在,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>)));
}
private MyList(SerializationInfo-info,StreamingContext-ctxt)
:base((列表)info.GetValue(“项目”,类型(列表)))
{
((List)this.Items).AddRange((List)info.GetValue(“Items”,typeof(List));
}
deTestList包含6个空项。
我不明白。您根本不需要实现
ISerializable
,只需要在类中添加Serializable
属性(除非您需要自定义序列化行为)。这样做很好(但我不确定为什么它不能与当前代码一起工作…类有另一个变量,我没有在示例代码中显示,我需要为它们自定义序列化行为,所以我需要实现ISerializable。哪个类,MyList还是SomeData?如果其中只有一个实现了ISerializable,那么这似乎是可行的……它们都需要实现ISerializable。奇怪。。。我可以看到SomeData对象被正确反序列化,但只有在列表被反序列化之后。。。
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>)));
}