某物资管理调度系统的数据序列化技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库技术
Database Technology
电子技术与软件工程
Electronic Technology & Software Engineering
某物资管理调度系统的数据序列化技术
王玉龙 宁蒙 王卫涛
(中国船舶集团公司第七一三研究所 河南省郑州市450015 )
摘 要:本文提出了一种基于Qt 跨平台的XML 序列化反序列化数据处理框架,该框架向软件开发人员提供一个高层次的功能接口来
对XML 文件进行读写操作。
最后在国产中标麒麟操作系统上进行仿真,取得了良好的效果。
关键词:XML;序列化;反序列化;Qt;国产操作系统
1引言
在某型号物资管理调度系统中,既有基于国产平台的中标麒 麟操作系统⑴,也有基于安卓平台的嵌入式系统,在每个计算机节
点中需将启动信息、运行信息等进行本地化,并且部分节点之间通
过网络以XML 形式传输给任务接收终端,任务接收后需要将数据
本地化及存储至人大金仓数据库l21o 另外任务执行情况和物资盘点
信息也要通过网络以XML 形式发送到管理调度计算机节点,最后
这些信息存储在人大金仓数据库服务器中。
不仅仅系统本身存在数
据交换,与外系统之间也存在数据交换的需求,物资管理调度系统 需要提供网络接收外部系统的基础数据信息,比如人员、单位、任
务等数据信息。
此外物资管理调度系统还需将一些数据信息发布出 去,供其他系统使用,这些信息在各系统之间进行交换时,都是以
XML 协议作为数据交换的载体。
该物资管理调度系统所在的数字化平台数据来源复杂,信息量 巨大,包括外围设备的实时采集数据、设备信息、调度过程数据、
盘库信息等,需要对其中的关键数据信息进行持久保存和在进程间
进行传输。
借鉴前期项目采用基于.net 的自带序列化反序列库⑴可
以解决此类问题。
XML 序列化就是将对象状态转换为XML 文件,
反序列化则是将XML 文件转换为对象实例,这两个过程可以轻松 实现存储和传输数据⑷。
本文提出…种基于Qt 跨平台的XML 序列化反序列化框架来解 决国产操作系统平台间的数据交换和共享问题,该框架扩展性强,
成员变量可以为基础数据类型(Int 、QString> QBool 、QDateTime 等)、
集合类型(QList 、QMap 等)以及自定义类型(指针)实现XML 序
列化反序列化功能,有效解决了信息存储、传输和共享的问题。
2算法实现
利用面向对象程序设计中的继承以及虚函数概念叫 结合Qt
中元对象机制,自研对业务软件提供的XML 序列化和反序列化功
能。
下面对XML 序列化和反序列化算法设计分别进行详细说明。
2. 1 XML 序列化算法
XML 序列化就是通过对外接口将类对象转化为可以网络传输 或者本地保存的XML 文件,核心思想是将类的名称映射成XML
文件的根节点元素;不同类型的各成员变量名称映射为XML 文件 的属性名称;成员变量的值映射为xml 文件内的属性值;对于成员
变量为基础数据类型的变量较容易映射,但是集合类型(QList 、
Start
图1:序列化功能内部函数之间调用图(虚线框内表示内部实现、箭头表示函数调用)
QMap 等)以及自定义类型(指针)需要进行复杂的嵌套循环和基
类指针调用;下面对XML 序列化功能设计相关的自研函数进行详
细说明,见表1所示。
其中函数InstanceToXml ()为序列化功能的唯一对外接口,实
现将类实例转换为XML 文件,函数与函数之间的调用关系见图1
所示。
XML 序列化功能内部主要函数接口 instanceToXml 的实现流程
主要分以下步骤,详细流程如图2所示。
(1) 首先获取待序列化实例的元对象(MetaObj );
(2) 通过元对象(MetaObj )得到序列化类的N 个公有成员变量
(3) 依次遍历N 个公有成员变量,并且判断当前成员变量是 什么类型;
(4) 若为list 集合类型,调用listToXml 函数进行增加相应节点(5) 若为map 集合类型,调用mapToXml 函数进行增加相应 节点;
(6) 若为int 、string 、bool 等基础类型,直接增加相应xml 节
点即可;
(7) 若为自定义类型,使用该函数迭代即可;(8) 遍历完所有成员变量,函数退出。
2. 2 XML 反序列化算法
151
数据库技术Database Technology
电子技术与软件工程
Electronic Technology&Software Engineering 表2:反序列化相关函数及说明
表1:序列化相关函数及说明
序号接口名称接口类型说明
1static XmlSerializer*instance()公共创建唯一xml序列化反序列化类实例,便于内存管理:
2void instanceToXml(QObject*object,const
QString&xmlName)
公共
通过XmlSerializer类实例进行访问该函数,参数object为将要序列化的类
指针(必须绅承自QObjcct类),xmlName为序列化为xml文件的名称;
3void instanceToXml(QObject*object,
QDomElement*parentElement)
私有
该函数为门加义类型的xmi序列化核心函数,自定义类型(成员变量)相对
应的非根结点,若初始化parentElement参数为null,则对应整个xml文件的
根结点,具体流程如图2所示;
4void listToXml(const int&listCnt,QVariant
&listType,QDomElement*parentElement)
私有
被私有函数instanceToXml()内部调用。
将list类型成员变量转换为xml结
点信息。
各参数具体含义,listCnt为list类型成员变量的空间大小;listType
为list类型成员变量;parentElement为list类型成员变量所对应的结点指针;
5void mapToXmi(const int&mapCnt,QVariant
&mapType,QDomElement*parentElement)
私有
被私有函数instanceToXml()内部调用。
将map类型成员变量转换为xml
结点信息。
各参数具体含义,mapCnt为map类型成员变量的空间大小;
mapType为map类型成员变量;parentElement为map类型成员变量所对应
的结点指针;
6void saveXml(const QString&xmIName)私有将序列化得到的xml文件进行保存。
序号接口名称接口类型说明
1static XmlSerializer*instance()公共创建唯一xml序列化反序列化类实例,便于内存管理;
void XmlToInstanse(QObject*object,const QString&xmlName)公共
通过XmlSerializer类实例进行访问该函数,参数object为将要反序列化的类指针(必须继承自QObject类),xmlName为反序列化为xml文件的名称。
3void xmlToInstanse(QObject*object, QDomElement*parentElement)
QDomNode compareTagName(const 4QDomElement*parent Element,con st QString&propertyName)
该私有函数为xml反序列化核心函数,参数object为结点对应的实例指针,私有参数parentElement为非根结点(自定义类型)或者根结点(反序列化类型)的反序列化,若对根结点进行反序列化则该参数为null,具体流程如图4所示。
私有供私有函数xmlToInstanse()内部调用。
用于父结点下所有子结点的标签内容与propertyName进行对比,若查找到相同的,则返回该子结点,否则返回null。
6QList<QVariant>xmlToList(const
QDomElement&xmlListElement)
私有
供私有函数xmlToInstanse()内部调用。
用于将xml文件内相应List集合结点
转换为QList<QVariant〉类型。
QMap<QString,QVariant>xmlToMap(const
QDomElement&xmlMapElement)
私有
供私有函数xmlToInstanse()内部调用。
用于将xml文件内相应的map集合结
点转换为QMap<QVariant>类型。
表3:某调度台位配置信息(ConsoleConfig)结构
类名成员变量类型成员变量名称备注
ConsoleConfig Qlist<Qvariant>mConsoleContainer Qvariant内置Console*类型,表示多个台位信息的集合
Qstring mConsoleldentity台位名称
Qstring mOuterlp台位外网IP
Console Qstring mlnterlp台位内网1P
Bool mConsoleStatus台位状态
QDateTime mLastLogin最后一次登录时间
XML反序列化是XML序列化的反过程,通过对外接口将网络思想是将XML文件的根节点元素映射成类的名称;XML文件的属传输中XML文件流或者本地保存的XML文件转化类对象,核心性名称映射为不同类型的各成员变量名称;XML文件内的属性值
152
数据库技术
Database Technology
电子技术与软件工程
Electronic Technology & Software Engineering
T
图2:序列化---虚函数instanceToXml ()流程图图4:反序列化---虚函数xmlToInstanse ()流程图
r
Start
图3:反序列化功能内部函数之间调用图 (虚线框内表示内部实现、箭头表示函数调用)
///台位配置信息序列化
ConsoleConfig *console_config=new ConsoleConfig();Console *console_l ,*console_2;//A 台设置参数
console l=new Console ();
console_l->mOuterIp=QString ::fromUtf8("192.168.14.1"); console_l->mInterIp=QString ::fromUtf8("192.168.15.1"); console_l->mConsoleIdentity=
QString :: fromUtf8("调度A 台");
console_l->nConsoleStatus=true;
console_l->mLastLogin=QDateTine::currentDateT ime ();//B 台设晝参数
console_2=new Console ();
console_2->ni0uterIp=QString ::fromUtf8("192.168.14.2"); console_2->mInterIp=QString ::fromUtf 8("192.168.15.3M ); console_2->mConsoleIdentity=QString::fromUtf 8("调度B 台"); console 2->raConsoleStatrue;
cons o le_2->mLas t Log i n =QDateTine::currentDateTime (); QVariant ql,q2;
ql .setValue<Console *>{console_l );q2・setValue<Console *>(console 2);
consoleconfig->mConsoleContainer ・append(ql ); console_conf ig->mConsoleContainer .append (q2); Xml S erialize i ■:: instance () ->InstanceToXnil
(console_conf ig ,"ConsoleConfig . xml M );
图5: XML 序列化上层调用代码
映射为成员变量的值;对于XML 文件或流存在嵌套或者重复结构 映射比较复杂,即映射为类中集合类型(QList 、QMap 等)以及自
定义类型(指针)的成员变量;接下来对XML 反序列化功能设计 相关的自研函数进行详细说明,见表2所示。
其中函数XmlToInstanceO 为反序列化功能的唯一对外接口,
实现将XML 文件转换为类实例,函数与函数之间的调用关系见图
3所示。
XML 反序列化功能内部主要函数接口 xmlToInstance ()的
实现流程主要分以下步骤,详细流程如图4所示:
(1)首先获取待反序列化的XML 文件的根节点或者自定义
类型根节点;
153
数据库技术Database Technology
电子技术与软件工程
Electronic Technology & Software Engineering
⑥ ConsoleConfigjtml x \
<?x«l version=M l .0" encoding="UTF -8"?> <ConsoleConfig>
<i>ConsoleContainer>
vConsole 二〉
<m0uterIp>192.168.14.l</mOuterIp><mlnterlp>192.168.15.l</mlnterlp>
<aConsoleIdentity>ifl^A 台 v/«KonsoleIdentity> <mConsoleStatus>true</«ConsoleStatus>
<mLastLogin>2018-01-08 10:25:05</«LastLogin> v/Console 二〉<Console^>
<»0uterIp>192.168.14.2</»0uterIp> <«lnterlp>192.168.15.3</«InterIp>
<«ConsoleIdentity>^WTB 台 v/MonsoleIdentity> <nConsoleStatus>t rue</»ConsoleStatus>
<mLastLogin>2018-01-08 10:25:05</«LastLogin> v/Console 二〉
</mConsoleContainer> </ConsoleConfig>
图 6:生成"ConsoleConf ig. xml ” 文件
//台位配囂信息反序列化
ConsoleConfig* re_console_config=new ConsoleConfig();
XnlSerializer ::instance!)->XnlToInstansefre_console_config,"ConsoleConfig .xnl 1'); qDebug( )«■ •**••***•••*台位配買信息打印
•***•••***•****";
qDebug()«" 台位数■■:
"<<re console config->nConsoleContainer.count(); Console *re console=NULL;
for(int i=0;i<re_console_config->nConsoleContainer.count();i++){
re_console=dynaraic cast<Console*>(re_con«ole_config->
mConsoleContainer.at(i).value<QObject*>());
qDebug()«"台位名称:"<<re console->nConsoleIdentity;qDebug ()«" "«re_console->mConsoleIdentity
<<"外W lP : U<<re_con8ole->n0uterlp;
qDebug ()«" "«re_console->mConsoleIdentity
<v “ 内W lP :"«re_con8ole->mInterIp;
qDebug ()«" "«re_console->mConsoleIdentity
<<"tt*:"<<re_console->nCon8oleStatuBj
qDebug ()«" "«re_console->mConsoleIdentity
<v"最后豎录时间:
-<<re_console->raLastLogin .toString (-yyyy-MM-dd hh :nira :8s");
re_console=NULL;
图7: XML 反序列化上层调用代码
*•1A
1X
1X 1A 1X e
» • O • • O
8 8 2 8 8 2 丁
6 6 ■ 6 6 ■ 1 1 1 1 息2.
2.j):042.S):
倉 9 9 一189 9 -IH /1 1A e >f - ”
1A 1* e Tt
・
置・ r 救・ n 配台p:p:t "台p:p:t 汁 i A l l :蚩 B I I :蛋 M 度网网态后度网网态后 涨调外内状最调外内状I 楽2
・ ■糸 ■ • ■ ■ ・・・・ **|:恥台台台台^:台台台台 ♦ s ^w
a a a a ^
b b b
b **数名度度度度名度度度度
**位位调调调调位调调调调 **台台•-
■
•
台・图8:反序列化程序运行结果
(2) 获取实例元对象,并通过元对象得到N 个公有成员变量;(3) 依次遍历N 个公有成员变量,通过当前成员变量名,使 用compareTagName()函数返回相对应结点,接下来判断成员变量
的类型,并且一一赋值;
(4) 若为list 集合类型,调用xmlToList 函数对相同成员变量 赋值;
(5) 若为map 集合类型,调用xmlToMap 函数对相同成员变
量赋值;
(6) 若为int 、string 、bool 等基础类型,对当前成员变量赋值;
(7) 若为自定义类型,使用该函数迭代并对当前指针变量字
段进行赋值;
(8)遍历完所有成员变量,函数退出。
3仿真
在中标麒麟操作系统桌面版V6.0上,以某调度台位配置信息 为例进行仿真说明,该调度台配置信息类(ConsoleConfig)包含了字 符串、布尔、时间、集合及自定义类型等类型,具体类结构如表3 所示。
3. 1 XML 序列化上层调用实例
首先定义ConsoleConfig 类并且对其进行初始化,然后使
用序列化功能接口,具体代码如图5所示,运行程序后生成
41 ConsoleConfig. xml"文件,如图 6 所示。
3. 2 XML 反序列化上层调用实例
接下来将序列化程序生成的“ConsoleConfig. xml ”文件进行反
序列化,具体代码如图7所示,程序运行结果如图8所示。
根据运行结果看出使用该序列化反序列化方法可以完成相应功
能,满足预期效果。
4结论
本文利用面向对象程序设计中的继承以及虚函数概念,结合Qt 中元对象机制,在国产中标麒麟操作系统上设计开发出一套XML
序列化反序列化框架,该框架可扩展性和维护性强并且支持的数据
类型(基础类型、集合类型以及自定义类型等)较丰富,可满足大
部分物资调度管理系统业务软件的使用需求,提高了软件开发效率
和软件产品质量。
参考文献
[1] 张京林.国产操作系统产业化现状和发展探讨[J ].科技与创
新, 2016 (20).
[2] 张晔嘉.国内信息系统自主可控生态环境分析[J1.电子质
量, 2019 (07).
[3] 高殳群,俞家文,丁俊松.NET Framework 中序列化与反序列
化方法的分析和应用[J ],微计算机应用,2007, 29 (11).⑷李雯,谢辅雯.XML 数据交换技术的应用与研究[J ].计算机与
现代化,2008. 191-99.
[5]和力,吴丽贤.关于C 卄虚函数底层实现机制的研究与分析[J ]. 计算机工程与设计,2008 (10).
作者简介
王玉龙(1988-),男,山西省长治市人.硕士研究生.研究方向
为某军用物资管理调度系统设计.
宁蒙(1988-),男,河南省郑州市人.硕士研究生.研究方向为
某军用物资管理调度系统设计数据库设计.
王卫涛(1989-),男.工程师.研究方向为某物资管理系统设计.
154。