【问题标题】:Should I use a Namespace of an XML file to identify its version我应该使用 XML 文件的命名空间来识别其版本吗
【发布时间】:2010-06-29 23:41:18
【问题描述】:

我正在使用 DataContractSerializer 将具有 DataContract 和 DataMember 属性的类序列化为 XML 文件。我的课程可能会在以后发生变化,因此序列化文件的格式也可能会发生变化。我想用版本号标记我保存的文件,这样我至少知道每个文件来自哪个版本。我仍在决定如何以及是否要添加将旧格式的文件迁移到更高格式的功能。但现在我很乐意只识别版本不匹配。

XML 文件的命名空间是否是存储文件版本的正确位置?我正在考虑使用 DataContract 属性将我的类归因于如下。

[DataContract(Name="MyClass",Namespace="http://www.mycompany.com/MyProject/1.0
public class MyClass
    ...

然后,如果 MyClass 发生变化,我会更改命名空间...

[DataContract(Name="MyClass",Namespace="http://www.mycompany.com/MyProject/2.0)]
public class MyClass
    ...

这是 XML 命名空间的正确用法,还是有另一种更受欢迎的方式来保存 XML 文件的版本?

【问题讨论】:

    标签: c# .net xml namespaces datacontractserializer


    【解决方案1】:

    您可以这样做,但是从 XML Infoset 的角度来看,您的数据的 XML 表示在版本之间变得完全不同(其中命名空间是元素的限定名称的一部分),所以您有既不向后也不向前兼容。

    现在,XML 的一个优势是它可以通过与 XPath 和 XSLT 等技术向前兼容的方式轻松处理 - 您只需选择您可以解释的元素,并保留您无法识别的任何内容。但这要求具有相同含义的元素在版本之间保持相同的名称(包括命名空间)。

    一般来说,最好将您的架构设置为forward-compatible。如果您无法做到这一点,您可能仍希望提供与现有工具尽可能多的兼容性(与只读取数据的工具相比,与同时编写数据的工具相比,实现兼容性通常更容易)。因此,您避免在这种情况下存储版本号,而只是尝试解析您给出的任何内容,如果输入肯定格式错误,则会发出错误信号。

    如果您到了绝对必须打破两个方向的兼容性并从头开始的地步,建议的处理 WCF 数据协定的方法确实是通过更改命名空间,如best practices on data contract versioning 中所述。那里也有一些小的变化,例如在 URL 中使用发布日期而不是版本号(W3C 非常喜欢他们的架构),但这些主要是风格。

    【讨论】:

    • 正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多