构造函数中的 XML 序列化代码执行顺序 - 重新排序的方法?

Dra*_*tar 1 .net c# xml serialization constructor

我使用内置的 .NET 功能 (XmlSerializer.Deserialize) 将 XML 文件序列化为对象。设置对象的字段后,我想通过调用对象构造函数中的附加代码来处理该数据。不幸的是,单步执行代码会发现在执行序列化逻辑之前首先执行“附加”代码。这使得该方法不可行,因为尚未初始化字段并且没有数据可操作。

这个问题有已知的解决方案吗?到目前为止,我一直调用第二种方法来初始化数据,但它很笨拙且容易出错:必须在每次序列化后调用它(其他程序员可能不知道这一点),否则我必须创建另一个包装器来加载对象(然后东西开始螺旋上升)。

Mar*_*ell 5

如果正在调用构造函数,它将始终是第一件事(请注意,某些序列化程序会跳过构造函数;XmlSerializer 始终运行公共无参数构造函数)。因此,任何逻辑都必须在属性等中。

您在这里真正描述的是“序列化回调”——即一种让序列化程序在序列化和/或反序列化之前和/或之后运行您的方法的方法;一些序列化程序支持回调——但是,XmlSerializer 支持。

唯一的选择XmlSerializer是实现IXmlSerializable,但坦率地说,这是一个巨大的痛苦。如果可能,我建议:

  • 反序列化后,自己手动调用方法
  • 或者,将序列化程序切换为支持回调的序列化程序

DataContractSerializer支持回调并且可以做有限的xml - 不像细粒度的控制XmlSerializer(特别是没有属性);如果你想切换到二进制,protobuf-net 支持回调。

  • @Merlyn `FormatterServices.GetUninitializedObject(type)` (2认同)