代码之家  ›  专栏  ›  技术社区  ›  Tom W

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

  •  0
  • Tom W  · 技术社区  · 14 年前

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

    假设我正在开发一个基于文件的界面的桌面应用程序,也就是说,用户将他们的进度存储在磁盘上的一个文件中——这对于绝大多数的生产力应用程序来说是相当标准的,除此之外还有很多。文件基本上是XML,其模式通过某种方式存储在应用程序中。

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

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

    编辑第1页 :

    经进一步检查,XML模式本机提供了“version”属性。这大概是.NET中xmlschema类型的字符串属性“version”的源代码,它是我的预期平台。这一切都很好,但得到我的文件和我的申请尊重这个价值是另一回事。这将是微不足道的,因为 克布林明顿 建议在应用程序文件中强制使用“schema version”属性。然后,我只需将加载的XML文件中的version属性与模式匹配,运行验证,并让应用程序适当地抛出一个合适的/礼貌地斥责用户/勇敢地挣扎。

    编辑第2页 :

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   kbrimington    14 年前

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

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

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