5

classBを含むclassAがあり、両方とも[Serializable]であるとします。

デシリアライズでは、classBが最初にデシリアライズされると思いました。

ただし、これは当てはまりません。各[OnDeserialized]メソッドがヒットしたときにログに記録するだけで確認できたからです。

今、私は次の問題を抱えています:

classAの逆シリアル化が完了すると、classBの値を使用してそれ自体をセットアップすることになっています。残念ながら、この時点ではclassBはまだ逆シリアル化されていないため、classAの設定が間違っています。

BinaryFormatterにclassAの前にclassBを逆シリアル化するように強制するか、オブジェクトグラフを上から下ではなく下から上に解決できれば、私の問題は解決します。

もう1つの明らかな解決策は、クラスBが逆シリアル化されたときにイベントを発生させてから、classAをセットアップすることですが、このエレガントでない回避策は避けたいと思います。

ですから、誰かがより良い解決策を知っていれば幸いです。

4

4 に答える 4

3

オブジェクトのシリアル化と逆シリアル化の順序を明示的に制御する必要がある場合は、ISerializableA のインターフェイスを実装することをお勧めします。

public class ClassA : ISerializable
{
    private ClassB _dependency;

    public ClassA(SerializationInfo information, StreamingContext context)
    {
        _dependency 
            = (ClassB)information.GetValue("_dependency", typeof(ClassB));

        // TODO: Get other values from the serialization info.
        // TODO: Set up stuff from dependent object.
    }

    public SerializationInfo GetObjectData()
    {
        information.AddValue("_dependency", _dependency, typeof(ClassB));

        // TODO: Add other fields to the serialization info.
    }
}
于 2009-10-28T15:10:07.297 に答える
1

でマークされたメソッドを使用して、[OnDeserialized]必要なシリアル化後の初期化を処理することをお勧めします。逆シリアル化される順序は気にしません。

于 2009-10-28T13:15:53.000 に答える
1

classA にIDeserializationCallbackインターフェイスを実装させることができます。そのOnDeserializationメソッドは、classB オブジェクトを含むオブジェクト グラフ全体がデシリアライズされた後にのみ呼び出されます。

于 2010-09-07T14:12:27.007 に答える
0

次の 2 つの手順でうまくいくかもしれません。

  1. [OnDeserialized]classBのメソッドを安全に複数回呼び出せるようにします。
  2. classAのメソッドで、含まれている classB オブジェクトのメソッドを[OnDeserialized]明示的に呼び出します。[OnDeserialized]

BinaryFormatter最終[OnDeserialized]的に classB オブジェクトのメソッドを再度呼び出すことになりますが、ステップ 1 で安全になります。

于 2010-09-07T14:06:32.660 に答える