.net 文件格式版本的最佳/最可移植的方法

.net 文件格式版本的最佳/最可移植的方法,.net,xml,xsd,versioning,file-format,.net,Xml,Xsd,Versioning,File Format,这个问题涉及XML模式和文件 假设我正在开发一个具有基于文件的界面的桌面应用程序,即用户将他们的进度存储在磁盘上的文件中,这对于绝大多数生产效率高的应用程序以及其他许多应用程序来说都是相当标准的。该文件基本上是XML,其模式通过某种方式存储在应用程序中 众所周知,随着新功能的添加,模式很可能会发生变化。因此,为了进行严格的兼容性管理,我想确保程序可以通过检查文件来判断它最后保存在哪个模式版本下,并通过一个或多个转换自动将文件管道化,以将其表示为工作文件格式,即最新的模式修订 实现这种功能的最佳实

这个问题涉及XML模式和文件

假设我正在开发一个具有基于文件的界面的桌面应用程序,即用户将他们的进度存储在磁盘上的文件中,这对于绝大多数生产效率高的应用程序以及其他许多应用程序来说都是相当标准的。该文件基本上是XML,其模式通过某种方式存储在应用程序中

众所周知,随着新功能的添加,模式很可能会发生变化。因此,为了进行严格的兼容性管理,我想确保程序可以通过检查文件来判断它最后保存在哪个模式版本下,并通过一个或多个转换自动将文件管道化,以将其表示为工作文件格式,即最新的模式修订

实现这种功能的最佳实践方式是什么?在我看来,最简单的方法似乎是为每个修订使用不同的模式名称空间,并确保至少文件的document元素引用了正确的名称空间。这种方法的问题在于,在我看来,它打破了文件结构之间的关系——即,在修订版x下保存的文件的文档元素与修订版y下的相应元素的类型相同,但就应用程序所知,除非我明确告诉它,否则它们是不相关的。然而,我敢说这种逻辑是XML名称空间存在的部分原因,所以我不能确定。你怎么说

编辑#1

进一步检查后发现,XML模式本机提供了一个“version”属性。这可能是.Net中XmlSchema类型的字符串属性“Version”的来源,这是我想要的平台。这一切都很好,但让i)我的文件和ii)我的应用程序尊重此值是另一回事。正如kbrimington所建议的那样,在应用程序文件中强制使用“schema version”属性是很简单的。然后,我只需将加载的xml文件中的version属性与模式匹配,运行验证,并让应用程序适当地抛出一个fit/礼貌地责骂用户/勇敢地继续奋斗

编辑#2


如果有人感兴趣,我会在模式上使用'version'属性,并将其与应用于包装器的自定义属性相匹配。包装器从表示模式的项目资源文件中检索字符串(将进行检查以确保模式的版本与属性指定的版本匹配)。main()所做的第一件事是构建一个要使用的模式查找表,按版本索引,使用反射检查可用的版本包装类型。这听起来像是一种过度工程化的做事方式,但我正试图提前思考,通过使用几个可以插入新功能的任意步骤,在中构建冗余和灵活性。可能的改进包括实现自定义资源管理器类型,以避开此处描述的一些Heath Robinson功能。

许多文件格式、XML和其他格式都考虑了向前兼容性。甚至位图格式的标题中也有定义标题大小的元素,因此可以使用不同的标题结构定义新的位图格式

我建议至少定义一些关于文件格式的不变规则。版本指示符可以是名称空间(如您所建议的)、文件扩展名,甚至只是文档中已知位置的元素

如果您可以说“无论模式如何,这里总会有一个
元素,我可以使用它来确定在验证时使用哪个版本的模式…”,那么问题就解决了。关键是要有一些可以依赖的东西来确定版本,而不管还有什么可能改变