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

本文关键字:反序列化 对象 成员类 序列化 | 更新日期: 2023-09-27 18:31:59

我有以下类:

[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 的 listOfB 只是 NULL 对象的条目,与 listOfB 中实际有多少 B 匹配

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

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

Realize 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)
  }
}