5

假设我有包含 classB 的 classA,并且两者都是 [Serializable]。

我假设,在反序列化 classB 将首先反序列化。

然而,情况并非如此,因为我可以通过在每个 [OnDeserialized] 方法被命中时记录来确认。

现在我有以下问题:

在 classA 的反序列化完成后,它应该使用 classB 中的值进行自我设置。不幸的是,此时 classB 尚未反序列化,因此 classA 设置错误。

如果我可以强制 BinaryFormatter 在 classA 之前反序列化 classB,或者从下到上而不是从上到下解析对象图,我的问题就会得到解决。

另一个明显的解决方案是让 classB 在反序列化时触发一个事件,然后让 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接口。只有在反序列化整个对象图(包括 classB 对象)后,OnDeserialization才会调用它的方法。

于 2010-09-07T14:12:27.007 回答
0

这两个步骤可能会奏效:

  1. 使[OnDeserialized]classB 的方法可以安全地多次调用。
  2. [OnDeserialized]classA 的方法中,显式调用[OnDeserialized]包含的 classB 对象上的方法。

最终BinaryFormatter将再次调用[OnDeserialized]classB 对象上的方法,但第 1 步使其安全。

于 2010-09-07T14:06:32.660 回答