【问题标题】:XmlSerializer: XSD generated classes serialization issuesXmlSerializer:XSD 生成的类序列化问题
【发布时间】:2016-03-01 09:15:24
【问题描述】:

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

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

  • XSD:时间用xml类型表示timeXmlSerializer格式:HH:mm:ss.fff
  • 规范文档:时间必须使用以下格式HH:mm

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

目前我们必须假设,规范文档的格式需要得到尊重。所以我一直在寻找确保这一点的选项。

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

我已按优先顺序对列表进行了排序。

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

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

【问题讨论】:

    标签: .net xsd xml-serialization generated-code


    【解决方案1】:

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

    原因很简单。我们仍然可以通过 XSD.exe 使用标准类生成,并保留 XmlSerializer 类的所有优点。

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

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

    我们已经对其进行了测试,它的工作原理就像一个魅力。

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多