1

我有以下课程:

[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 匹配

如何解决这个反序列化序列问题?

4

1 回答 1

2

实现IDeserializationCallbackIDeserializationCallback.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)
  }
}
于 2012-04-23T23:04:17.013 回答