假设我有classA,其中包含classB,两者都是[Serializable]。
我假设,在反序列化时,classB将首先被反序列化。
但事实并非如此,因为我可以通过记录每个[OnDeserialized]方法被点击来确认。
现在我有以下问题:
在classA的反序列化完成后,它应该使用classB中的值进行自我设置。不幸的是,此时尚未对classB进行反序列化,因此classA设置错误。
我的问题将得到解决,如果我可以强制BinaryFormatter在classA之前反序列化classB,或者将对象图从底部解析为顶部而不是从上到下解析。
另一个明显的解决方案是让classB在反序列化时触发一个事件,然后让classA自行设置,但我想远离这个非优雅的解决方法。
如果有人知道更好的解决方案,我将不胜感激。
答案 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)
这两个步骤可能会起到作用:
[OnDeserialized]
方法安全多次调用。[OnDeserialized]
方法中,在包含的classB对象上显式调用[OnDeserialized]
方法。 BinaryFormatter
最终会再次调用classB对象上的[OnDeserialized]
方法,但步骤1会使其安全。