如何在C#中使用BinaryFormatter更改反序列化的顺序?

时间:2009-10-28 12:49:05

标签: c# .net serialization binaryformatter

假设我有classA,其中包含classB,两者都是[Serializable]。

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

但事实并非如此,因为我可以通过记录每个[OnDeserialized]方法被点击来确认。

现在我有以下问题:

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

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

另一个明显的解决方案是让classB在反序列化时触发一个事件,然后让classA自行设置,但我想远离这个非优雅的解决方法。

如果有人知道更好的解决方案,我将不胜感激。

4 个答案:

答案 0 :(得分:3)

如果您必须明确控制对象序列化和反序列化的顺序,我建议您为A实现ISerializable接口:

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.
    }
}

答案 1 :(得分:1)

我建议只使用标有[OnDeserialized]的方法来处理所需的任何序列化后初始化,而不关心它们反序列化的顺序。

答案 2 :(得分:1)

您可以让classA实现IDeserializationCallback接口。只有在反序列化了整个对象图后,才会调用其OnDeserialization方法,包括classB对象。

答案 3 :(得分:0)

这两个步骤可能会起到作用:

  1. 使classB的[OnDeserialized]方法安全多次调用。
  2. 在classA的[OnDeserialized]方法中,在包含的classB对象上显式调用[OnDeserialized]方法。
  3. BinaryFormatter最终会再次调用classB对象上的[OnDeserialized]方法,但步骤1会使其安全。