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 は、実際に listOfBs にある B の数と一致する NULL オブジェクトのエントリにすぎません。

この逆シリアル化シーケンスの問題をどのように解決しますか?

4

1 に答える 1

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)
  }
}
于 2012-04-23T23:04:17.013 に答える