XmlSerializer:XSD 生成了 类 个序列化问题
XmlSerializer: XSD generated classes serialization issues
考虑以下场景。我们有一个定义技术文档交换格式的 XSD 文件(一个根类型由多个 complexTypes
组成)。
此外,还有一个规范定义了每个字段的值范围和格式。
显然,这两个文件是由不同部门创建的,因为格式定义不同。例如
- XSD:时间用xml类型表示time(
XmlSerializer
格式: HH:mm:ss.fff)
- Spec doc: 时间必须使用以下格式HH:mm.
从技术上讲,事情很简单。我们使用 XSD.exe 来生成 classes。但是现在使用 XmlSerializer
后输出文件看起来不一样了。没有机会协商格式,因为它是由于影响整个市场的法规而创建的,因此有很多交易对手。
根据我们必须假设的时刻,需要遵守规范文档的格式。所以我一直在寻找确保这一点的选项。
- 为受影响的
complexTypes
.
生成的 classes 添加并实现 IXmlSerializable
接口,不幸的是,这不是一个选项,因为 XmlSerializer
的初始化抛出异常:"There was an error reflecting type."
或者有什么办法可以避免这种情况?为根类型实现接口不是一种选择,因为它非常庞大和复杂。
- 找一个序列化库,其中可以提供某种类型格式映射,这样就可以实现字段中的自定义格式。
目前,我没有找到类似的东西。但也许有人可以给我提示。
- 序列化后通过
XPathNavigator
修改节点的字符串内容。
不是最好的方法,但它可以完成工作。
- 直接在生成输出中修改生成的classes并添加一些代理属性。
实际上不是最好的主意,因为重新生成(由于 XSD 文件的新版本)正在覆盖所有修改。不幸的是,不能在 partial class
中重新定义属性,对吗?
我已经按照偏好顺序对列表进行了排序。
所以我错过了一个选项吗?你会走哪条路?
我知道这不是典型的 How do I use class xyz 问题,但我仍然希望你能给我提示,如何这样通常处理的场景。
鉴于大量反馈,我决定采用选项 3。
原因很简单。我们仍然可以使用带有 XSD.exe 的标准 class 代,并保留 XmlSerializer
class.
的所有优点
有关详细信息,请参阅 MSDN 中的 article。流程非常简单。
- Select 个具有给定路径的节点
- 读取未类型化的值(字符串)并解析预期的类型化对象
- 使用所需格式从类型化对象写入非类型化值
我们已经对其进行了测试,它运行得非常好。
考虑以下场景。我们有一个定义技术文档交换格式的 XSD 文件(一个根类型由多个 complexTypes
组成)。
此外,还有一个规范定义了每个字段的值范围和格式。
显然,这两个文件是由不同部门创建的,因为格式定义不同。例如
- XSD:时间用xml类型表示time(
XmlSerializer
格式: HH:mm:ss.fff) - Spec doc: 时间必须使用以下格式HH:mm.
从技术上讲,事情很简单。我们使用 XSD.exe 来生成 classes。但是现在使用 XmlSerializer
后输出文件看起来不一样了。没有机会协商格式,因为它是由于影响整个市场的法规而创建的,因此有很多交易对手。
根据我们必须假设的时刻,需要遵守规范文档的格式。所以我一直在寻找确保这一点的选项。
- 为受影响的
complexTypes
.
生成的 classes 添加并实现IXmlSerializable
接口,不幸的是,这不是一个选项,因为XmlSerializer
的初始化抛出异常:"There was an error reflecting type."
或者有什么办法可以避免这种情况?为根类型实现接口不是一种选择,因为它非常庞大和复杂。 - 找一个序列化库,其中可以提供某种类型格式映射,这样就可以实现字段中的自定义格式。
目前,我没有找到类似的东西。但也许有人可以给我提示。 - 序列化后通过
XPathNavigator
修改节点的字符串内容。
不是最好的方法,但它可以完成工作。 - 直接在生成输出中修改生成的classes并添加一些代理属性。
实际上不是最好的主意,因为重新生成(由于 XSD 文件的新版本)正在覆盖所有修改。不幸的是,不能在partial class
中重新定义属性,对吗?
我已经按照偏好顺序对列表进行了排序。
所以我错过了一个选项吗?你会走哪条路?
我知道这不是典型的 How do I use class xyz 问题,但我仍然希望你能给我提示,如何这样通常处理的场景。
鉴于大量反馈,我决定采用选项 3。
原因很简单。我们仍然可以使用带有 XSD.exe 的标准 class 代,并保留 XmlSerializer
class.
有关详细信息,请参阅 MSDN 中的 article。流程非常简单。
- Select 个具有给定路径的节点
- 读取未类型化的值(字符串)并解析预期的类型化对象
- 使用所需格式从类型化对象写入非类型化值
我们已经对其进行了测试,它运行得非常好。