【问题标题】:How to change the order of Deserialization using BinaryFormatter in C#?如何在 C# 中使用 BinaryFormatter 更改反序列化的顺序?
【发布时间】:2010-12-10 20:37:40
【问题描述】:

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

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

但情况并非如此,我可以通过记录每个 [OnDeserialized] 方法被命中的时间来确认。

现在我有以下问题:

classA 的反序列化完成后,它应该使用来自 classB 的值来​​设置自己。不幸的是,此时 classB 尚未反序列化,因此 classA 设置错误。

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

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

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

【问题讨论】:

  • 根据问题标题,C# -> 重新标记

标签: c# .net serialization binaryformatter


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这两个步骤可能会奏效:

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

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

    【讨论】:

      【解决方案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.
          }
      }
      

      【讨论】:

      • 谢谢,那会奏效。唯一的缺点是,为了做一点小调整(更改反序列化顺序),我还必须手动获取我的类中的所有其他对象/字段。与此同时,我使用了我的问题中描述的不太优雅的解决方案(通过事件触发)。我想我会坚持下去,因为这种解决方法似乎比手动获取对象数据的冗长解决方案更简单。
      • @Thorsten Lorenz:你有没有找到其他解决方案?
      【解决方案4】:

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

      【讨论】:

      • 我不知道您是否正确理解了我的问题,正如它所解释的那样,我确实需要关注反序列化顺序,因为否则我的对象无法正确恢复。
      • 显然我必须拥有。您能否准确解释 A 和 B 之间需要发生哪些无法由序列化后事件处理的事件?
      • 细节无所谓,我想我已经解释得够清楚了:“classA的反序列化完成后,应该使用classB的值来设置自己。”只有在 classB 完全反序列化后才会设置这些值。
      猜你喜欢
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      相关资源
      最近更新 更多