使用 XSD.exe 的多个版本 C# 类/XSD
Posted
技术标签:
【中文标题】使用 XSD.exe 的多个版本 C# 类/XSD【英文标题】:Multiple Versions C# classes/XSD using XSD.exe 【发布时间】:2021-05-20 10:06:27 【问题描述】:我正在使用 XSD.exe 将相当复杂的 XML 架构(XSD 文件)转换为 C# 类。然后我使用 XmlSerializer 将 XML 读入内存并处理数据。
将来,XSD 会发生变化。所以会有新版本。我将不得不使用 XSD.exe 创建一个新的 cs 文件。但我还是想支持旧版本的 XML 文件。
解决此问题并同时支持新旧版本的 XML 文件的最佳方法是什么?显然,XSD.exe 创建的类将具有相同的名称。所以我真的不能只生成另一个与 XSD.exe 并行的 cs 文件。
欢迎任何想法。提前致谢!
【问题讨论】:
希望创建 xsd 的人只添加新功能而不更改现有功能。然后代码将同时处理新旧数据。只要你有一个数据库,你就应该包含一个版本号,这样你就可以编写读取版本号并处理差异的代码。 【参考方案1】:XML 数据绑定的优点是可以针对强类型类而不是无类型节点进行编码,但这会使版本控制变得棘手。
有关这方面的信息可以在Liquid XML Data Binder 2021 - Getting Started 文档的“架构版本控制”部分中找到。
【讨论】:
【参考方案2】:当架构很大、复杂或不断变化时,数据绑定技术(将 XSD 定义转换为强类型编程语言中的类型)绝对是一种痛苦。我强烈的建议是,找到不同的方法。我赚了很多咨询费,帮助人们从这个漏洞中挖掘出来。
使用更擅长应对变化和多样性的技术。 XSLT、XQuery、LINQ 甚至 DOM,如果必须的话。 XSLT 和 XQuery 作为一个选项提供模式感知功能,因此您可以获得一些好处(根据模式检查您的程序代码),而无需在每次发生更改时都重新构建和重新测试您的应用程序。
【讨论】:
【参考方案3】:感谢您的回答。
目前,我将 XSD.exe 生成的代码放在单独的命名空间中,并让它们派生自基类。
像这样,我可以使用一个或另一个类来生成/读取 XML。它现在似乎对我有用,因为没有新版本,架构不会改变。所做的任何更改都将放入新版本中。
【讨论】:
以上是关于使用 XSD.exe 的多个版本 C# 类/XSD的主要内容,如果未能解决你的问题,请参考以下文章
使用 xsd.exe 或 svcutil.exe 对 UWP 和 Xamarin 进行 C# XML 序列化