【问题标题】:Deserialization order over the inheritance tree继承树上的反序列化顺序
【发布时间】:2012-11-19 18:47:29
【问题描述】:

我有一个标记为Serializable 的基类,还有一个标记为Serializable 的派生类。我想在反序列化期间在基类中做一些事情,因此声明了一个标记为OnDeserializing 的方法,但重要的是此方法将在任何派生类的OnDeserializing 方法之前执行。
派生类也可能由其他人编写。
我可以相信基类的方法会在派生类中的任何序列化方法之前被调用吗?
我将使用SoapFormatter

【问题讨论】:

  • 我正在使用 IFormatter。由于某些原因,无法使用 XmlSerializer 等序列化程序。
  • 另一个有用的问题here。从我的测试来看,顺序是Base.OnDeserializing,Derived.OnDeserializing,Base.OnDeserialized,Derived.OnDeserialized,但这可能取决于对象图的确切结构。

标签: .net deserialization


【解决方案1】:

我会冒险说它可能会首先找到派生方法,而不是基于我所看到的将反射用于其他目的的基本方法。我建议您可能希望显式地从子级调用基本行为,而不是依赖于标记有该属性的方法的任何顺序。如果较低级别的对象是直接可实例化的,而不是抽象的,因此也可能有一个 OnDeserializing 标记的方法,您可能需要设置标志来指示该级别是否已被处理。

【讨论】:

  • 忘记写了,但是派生类可能是别人创建的,所以我无法控制。无论如何,谢谢您提供重要信息。很有帮助。
  • @RoadBump 你可能想考虑使用一个可以被覆盖的方法——这样你就可以控制继承类如何完成它,包括首先显式调用基类代码。跨度>
  • 听起来是个好主意。我想实现需要特殊构造函数的ISerializable 接口,请参阅here。使用构造函数会确保在派生类序列化之前调用基类的ctor吗?
  • @RoadBump 构造函数总是在设置任何属性或调用方法之前被调用。
  • 好的,创建了一个虚函数并从另一个标记为OnDeserialized的非虚函数调用它。现在继承人有机会称我的行为,如果他不这样做,他可以责怪自己:-)。
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多