我正在使用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文件的版本?
答案 0 :(得分:3)
你可以这样做,但是从XML Infoset的角度来看,你的数据的XML表示与版本完全不同(其中命名空间是元素的限定名称的一部分),所以你有既不向后也不向前兼容。
现在,XML的一个优点是可以使用XPath和XSLT等技术以前向兼容的方式轻松处理 - 您只需选择可以解释的元素,并保留任何您不认识的内容。但这需要具有相同含义的元素才能在版本之间保留相同的名称(包括命名空间)。
通常,最好制作模式forward-compatible。如果无法实现这一点,您可能仍希望尽可能多地提供与现有工具的兼容性(通常更容易实现与仅读取数据的工具的兼容性,而不是与编写数据的工具兼容)。因此,在这种情况下,您可以避免存储版本号,只是尝试解析您给出的任何内容,如果输入肯定是格式错误,则表示错误。
如果你必须完全打破两个方向的兼容性并从一个干净的平板开始,那么为WCF数据契约处理这个问题的建议方法确实是通过改变命名空间,如best practices on data contract versioning中所述。 。还有一些小的变化,例如在URL中使用发布日期而不是版本号(W3C非常喜欢它们的模式),但这些主要是风格的。