【问题标题】:Best/most portable way to version a file format版本文件格式的最佳/最便携方式
【发布时间】:2010-08-28 15:30:15
【问题描述】:

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

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

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

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

编辑#1

经过进一步检查,XML Schema 本身就提供了一个“版本”属性。这可能是 .Net 中 XmlSchema 类型的字符串属性“Version”的来源,这是我的预期平台。这一切都很好,但是让 i) 我的文件和 ii) 我的应用程序尊重这个值是另一回事。正如kbrimington 所建议的那样,在应用程序文件中强制使用“模式版本”属性将是微不足道的。然后,我只需将加载的 xml 文件中的版本属性与模式进行匹配,运行验证,并让应用程序适当地/礼貌地责备用户/勇敢地进行适当的斗争。

编辑#2

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

【问题讨论】:

    标签: .net xml xsd versioning file-format


    【解决方案1】:

    许多文件格式(XML 和其他格式)都考虑到了前向兼容性。甚至位图格式在标头中也有一些元素来定义标头的大小,以便可以使用不同的标头结构定义新的位图格式。

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

    如果您可以说“无论架构如何,这里总会有一个<version> 元素这里,我可以使用它来确定验证时要使用哪个版本的架构......”,那么问题就解决了。关键是要有一些你可以依赖的东西来确定版本,而不管其他可能会发生什么变化。

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 2011-04-06
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多