使用序列化成员类反序列化对象

时间:2012-04-23 22:53:13

标签: c# .net serialization

我有以下课程:

[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

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

1 个答案:

答案 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)
  }
}