结构化的配置文件设计与实现
2018-02-28张名明许坤凌旺
张名明 许坤 凌旺
摘要
软件中的数据结构常常需要保存到配置文件中,通常的配置文件格式如INI,XML在读取和保存时存在对结构化数据支持薄弱,易读性差等种种问题,为了解决如上问题,通过设计一套支持结构化数据的配置文件格式,并提供相关配置文件存取库实现原理。新的配置文件格式和相应实现原理提供了对结构化数据针对性的设计,减少了不同系统对配置文件功能的重复开发,提高了软件开发的效率并减小了缺陷率。
【关键词】结构化 配置文件 INIXML
软件是由数据结构与算法组成,数据结构在软件中是一个重要的组成部分,它是业务逻辑中数据的抽象,一个软件往往由很多数据结构组成,这些数据结构承载了软件业务逻辑中方方面面的数据,包括初始化数据,运行时数据,结果数据等。其中初始化数据往往存在于配置文件中,通过修改其中的数据达到修改程序行为的目的。通常的实现思路是软件利用INI或者XML格式的配置文件,实现一套解析的方法,并将解析后的数据填入初始化数据结构中;写入配置文件也一样,先将数据从初始化数据结构中取出,再依照INI或者XML的格式,将数据填入配置文件中。目前常用的处理方式存在大量重复的工作,需要有一种抽象层次更高的配置文件格式,以解决上述问题。
1 传统配置文件分析
传统的配置文件格式简单直观,技术较成熟,但也有一些不能避免的缺点:INI格式结构单一,只能存储简单的键值对类型,缺乏灵活性,技术陈旧。XML格式结构比较复杂,没有结构化的描述,不易于读写,额外字符较多,文件体积较大。一般的配置文件读取流程分为:
(1)准备配置文件;
(2)解析配置文件;
(3)保存配置项到初始化数据结构;
(4)使用配置项内容,其中解析配置文件功能需要在已有INI或者XML读写库上做二次开发,从前到后将解析到的配置项内容保存到内部初始化数据结构中,供后续的初始化流程使用。
通常这部分解析读取流程需要大量重复的工作量,也容易引入错误。故考虑设计一套抽象层次更高的配置文件格式,提供规定的语法,能够满足结构化数据格式的需求,并且具有简单直接,易读写以及占用体积小等优点。
2 设计与实现
2.1 配置文件格式分析
考虑到在高级程序设计语言中,结构化的数据结构通常是用类或者结构体实现,将一份配置文件设计为由一组配置项组成,每个配置项由配置项名称与配置项内容组成,每个配置项内容可以由下面的任意一项构成:
(1)矢量值:整形值,浮点型值,Bool值,字符串。
(2)数组:由一系列矢量值组成,数组中的每一项类型必须相同。
(3)组合:一个配置项的集合。
(4)列表:一系列的配置内容组成,包括矢量值,数组,组合以及列表。
2.2 配置文件格式设计
在具体实现过程中,参考类C语言和Python类脚本语言的编程范式,并考虑到工程实践的需求,将以上配置项需求设计成以下的格式:
(1)配置项格式,形式如:namevalue;其中name由字符,数字及下划线组成,并以字母或下划线开头,value必须是a、b、c、d四種配置项内容中的一种,
(2)组合配置项格式,形式如:{settings…},组合配置项可以包含任意多个配置项,但每个配置项名称必须唯一。
(3)数组配置项,形式如:[value,value…],小数组配置项可以包含0或n个元素,每个元素都必须是类型相同的矢量值。
(4)列表配置项,形式如:(value,value一),数组配置项可以包含0或n个元素,每个元素可以a、b、c、d四中配置项内容中的一种,且每个元素类型无需一致。
(5)整形配置项,包含两种类型:1.包含可选前导符(‘+、‘-)的n个0-9数字;2.十六进制字符,以‘0x作为前缀,接着n个十六进制字符(‘01-‘9,‘A-‘F,‘a-‘f)。
(6)浮点型配置项,由n个数字和1个小数点组成,并包含一个可选前导符(‘+、‘-),以及一个可选的指数,指数由一个字符(‘e、‘E),一个可选的符号字符以及n个数字组成。
(7)Bool型配置项,由‘true或者‘false组成,或者其他大小写混合的变种。
(8)字符串型配置项,由双引号分隔的任意文本组成。文字双引号可以通过在它们前面加上反斜杠来转义:\“'。转义序列\\','\f','\n','\r'和'\t'也可被识别,并具有同C语言中的含义。
(9)注释,包含三种类型:1.脚本风格,以#开头到行结尾的字符将作为注释,2.C语言风格,/*到*/之间的字符将作为是注释,3.C++语言风格,以‘//开头到行结尾的字符将作为注释。
通过以上a-i条语法规范定义的示例配置文件如下所示:
#Example application configuration file
version="1.01";
application=
{
Window{
title="My Application";
size={w=640;h=480;}:
pos={x=350;y=250;}:
};
list=(("abc",123,true),1.234,(/*anempty list*/));
misc={
pi=3.141592654;
int=1234;
columns=["Last Name","FirstName","Mi"];
bitmask=0x1FC3;//hex
};
};
2.3 配置文件存取库实现原理
配置文件的语法接近编程语言,故参考一般代码的编译方法,简化后的配置文件存取库实现词法分析和语法分析两个步骤。
在特定的编程语言平台,利用通用的词法分析和语法分析工具如Flex以及Bison等,通过导入对应的词法分析和语法分析规则,可以比较方便地将配置文件一步一步转换成配置项集合,配置项集合一般可以考虑通过各种编程语言通常会提供的Map结构来实现,并额外增加配置项查询,增加,修改和删除方法,即可实现一套特定编程语言平台的通用配置文件存取库。
3 结语
经过对配置文件结构化需求的分析,改进后的配置文件格式具备较完善的结构化特性,更接近程序语言,方便机器和人读写,弥补了旧式配置文件在存储结构化数据时的不足,并且因为配置文件格式只定义了数值,不存在计算表达式,所以也不会有代码注入等安全隐患。通过提供一份配置文件存取库实现原理,使得软件开发者只需要按照原理设计实现一套对应语言的配置库模块,就可以获得结构化配置方面所有的功能,并且该配置库可以重复使用,减少了配置功能方面重复的工作量,提高了软件开发的效率,也减少了缺陷率。
参考文献
[1]周霞,彭文惠.XML技术与应用教程[M].北京:电子工业出版社,2015.
[2]刘艳春,洪晓慧.Struts2框架核心配置文件的研究与应用[J].计算机技术与发展,2013(02).
[3]滕海坤,刘心声,李伦彬.嵌入式Java编译器的研究与设计[J].单片机与嵌入式系统应用,2018(04).