XmlSerializer:XSD 生成了 类 个序列化问题

XmlSerializer: XSD generated classes serialization issues

考虑以下场景。我们有一个定义技术文档交换格式的 XSD 文件(一个根类型由多个 complexTypes 组成)。
此外,还有一个规范定义了每个字段的值范围和格式。

显然,这两个文件是由不同部门创建的,因为格式定义不同。例如

从技术上讲,事情很简单。我们使用 XSD.exe 来生成 classes。但是现在使用 XmlSerializer 后输出文件看起来不一样了。没有机会协商格式,因为它是由于影响整个市场的法规而创建的,因此有很多交易对手。

根据我们必须假设的时刻,需要遵守规范文档的格式。所以我一直在寻找确保这一点的选项。

  1. 为受影响的 complexTypes.
    生成的 classes 添加并实现 IXmlSerializable 接口,不幸的是,这不是一个选项,因为 XmlSerializer 的初始化抛出异常:"There was an error reflecting type."
    或者有什么办法可以避免这种情况?为根类型实现接口不是一种选择,因为它非常庞大和复杂。
  2. 找一个序列化库,其中可以提供某种类型格式映射,这样就可以实现字段中的自定义格式。
    目前,我没有找到类似的东西。但也许有人可以给我提示。
  3. 序列化后通过XPathNavigator修改节点的字符串内容。
    不是最好的方法,但它可以完成工作。
  4. 直接在生成输出中修改生成的classes并添加一些代理属性。
    实际上不是最好的主意,因为重新生成(由于 XSD 文件的新版本)正在覆盖所有修改。不幸的是,不能在 partial class 中重新定义属性,对吗?

我已经按照偏好顺序对列表进行了排序。

所以我错过了一个选项吗?你会走哪条路?

我知道这不是典型的 How do I use class xyz 问题,但我仍然希望你能给我提示,如何这样通常处理的场景。

鉴于大量反馈,我决定采用选项 3。

原因很简单。我们仍然可以使用带有 XSD.exe 的标准 class 代,并保留 XmlSerializer class.

的所有优点

有关详细信息,请参阅 MSDN 中的 article。流程非常简单。

  1. Select 个具有给定路径的节点
  2. 读取未类型化的值(字符串)并解析预期的类型化对象
  3. 使用所需格式从类型化对象写入非类型化值

我们已经对其进行了测试,它运行得非常好。