繁体   English   中英

读取/写入同一配置文件的不同版本的设计方法

[英]Design approaches to read/write different version of same config file

在我们的项目中,我们获得了一个使用外部配置文件(例如server.xml)的应用程序。 现在我们需要在C ++ / QT中设计一个设置工具GUI来读取/编辑该配置文件,并且它应该能够处理该文件的所有不同版本。 用户将选择文件版本,然后继续进行编辑。 从一个版本到另一个版本的更改不会太大,也许有一个新的xml标记,即名称不同或位置不同的标记。

这样做的最佳设计方法是什么? 我们计划采用标准的MVC设计模式,但是如何处理所有不同的配置版本而又不会再次重写相同的GUI代码?

这里是示例配置文件:

<?xml version="1.0" encoding="utf-8"?>
<Server_configuration ver="11">
  <core>
    <enable-tms>true</enable-tms>
    <enable-gui-messages>true</enable-gui-messages>
    <waiting-for-config-timeout>10000</waiting-for-config-timeout>
    <remoting>
      <port>50000</port>
      <join-timeout>5000</join-timeout>
      <ismultithread>true</ismultithread>
      <maxconcurrentrequests>20</maxconcurrentrequests>
    </remoting>
  </core>
  <content>
    <ftp>
      <ip>192.168.0.227</ip>
      <port>21</port>
      <userid>******</userid>
      <passwd>******</passwd>
    </ftp>
    <library>
      <ip>192.168.0.227</ip>
      <port>50023</port>
    </library>
    <local>
      <asset-root>/assetroot</asset-root>
      <kdm-expiration-warning>172800000</kdm-expiration-warning>
    </local>
    <hula-store-daemon>
      <ip>127.0.0.1</ip>
      <port>5567</port>
    </hula-store-daemon>
  </content>
</Server_configuration>

这绝不是解决方案的下降,但我这里有一些事情要做/考虑。 每种情况都会有所不同。

  • 在您的配置文件中有一个明确的版本标识符。 对它们进行指纹识别是一种真正的(容易出错的)痛苦。
  • 考虑使用一个会在版本之间进行更新的工具。 这比阅读旧版本并尝试应用它们要容易。
    • 我可能更容易分别完成每个版本步骤,但这可以减少转换的“损失”。 一个快乐的混合方法是在各个版本之间进行次要更新,但要进行“检查点”主要升级,而这些升级将直接跳到最新的(或最新的“检查点”)。 这有点像是每隔一段时间拥有完整备份快照的增量备份
    • 让用户了解情况。 如果您要更改系统管理员的设置,系统管理员将不满意。 您可能希望使过程具有交互性,或将注释添加到每个添加/移动/删除设置的文件中。 我还建议将删除的设置保留在文件的某些部分中,以供用户参考。 (记下它们为什么也在那里)。
  • 备份旧文件。 您的脚本将崩溃,并且将占用数据。 做类似命名当前文件${oldname}.old-${ver}~ 将设置保存在文件的不同部分并不总是足够的,这将为您的用户省去很多麻烦。

版本控制应始终设计为健壮且尽可能简单。 对于您来说,确定应用程序的每个版本是否必须与安装工具的每个版本兼容(这是很少见的),或者例如,如果有任何更新的安装工具可以与之兼容的话,是否可以满足您的需求至关重要。较旧的应用程序,反之亦然。

单向兼容性

为后者设计的一种可能性是将版本属性添加到XML文件,但通过始终仅以向后兼容的方式更改XML文件的结构和语义来尝试将其永久保持在相同的固定值。 例如,添加元素是向后兼容的,只要安装工具可以用旧的安装工具和应用程序的行为相同的方式解释其缺失。 新的设置工具总是向新元素写入一个(等效)值也没有什么坏处,因为不需要与旧应用程序双向兼容。

当您无法维持输入的向后兼容性的日子到来时,您只需更改version属性的值并在设置工具中将其特殊括起来即可。

如果您针对XSD验证XML,请注意XSD实际上可以为您做一件经常有用的事情:分配默认属性值。 这样,设置工具的源代码甚至可能根本没有注意到基础文档缺少最近添加的属性!

两路兼容

需要严格的版本控制。 应该为XML文件的每个版本定义一个架构定义(XSD,RelayNG等),并且在安装工具读取,安装工具编写或由XML读取文件时,都应针对该文件对文件进行验证。应用。 如果相同XML的解释已更改,则模式定义对于多个连续版本可能是相同的,因此,如有疑问,请始终增加版本号。

做您可以教育每个人的事情,他们不能仅仅编辑最新的架构并消除它。 不可靠的版本比没有版本更糟糕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM