我有以下课程:
[Serializable]
public class A : ISerializable
{
List<B> listOfBs = new List<B>();
public A()
{
// Create a bunch of B's and add them to listOfBs
}
public A(SerializationInfo info, StreamingContext context)
{
listOfBs = (List<B>)info.GetValue("listOfBs",typeof(List<B>))
listOfBs.Remove(x=>x.s==5)
}
}
和
[Serializable]
public class B : ISerializable
{
public int s;
public B(int t)
{
s=t;
}
public B(SerializationInfo info, StreamingContext context)
{
s = info.GetInt32("s");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("s",s);
}
}
问题line listOfBs.Remove(x=>x.s==5)
抛出异常,因为B的反序列化构造函数在A完成之前不会运行。
当我单步执行代码时,A的listOfBs只是一个NULL对象的条目,它匹配listOfBs中实际有多少B
如何解决这个反序列化序列问题?
答案 0 :(得分:2)
实施IDeserializationCallback。当整个对象图的反序列化完成时,将调用IDeserializationCallback.OnDeserialization
。
我认为A类是实施它的最佳位置,您可以将问题代码放在A.OnDeserialization
中,如下所示。
[Serializable]
public class A : ISerializable, IDeserializationCallback
{
List<B> listOfBs = new List<B>();
public A()
{
// Create a bunch of B's and add them to listOfBs
}
public void OnDeserialization()
{
listOfBs.Remove(x=>x.s==5)
}
}