王玉龍 寧蒙 王衛(wèi)濤
(中國船舶集團(tuán)公司第七一三研究所 河南省鄭州市 450015)
在某型號物資管理調(diào)度系統(tǒng)中,既有基于國產(chǎn)平臺的中標(biāo)麒麟操作系統(tǒng)[1],也有基于安卓平臺的嵌入式系統(tǒng),在每個計(jì)算機(jī)節(jié)點(diǎn)中需將啟動信息、運(yùn)行信息等進(jìn)行本地化,并且部分節(jié)點(diǎn)之間通過網(wǎng)絡(luò)以XML形式傳輸給任務(wù)接收終端,任務(wù)接收后需要將數(shù)據(jù)本地化及存儲至人大金倉數(shù)據(jù)庫[2]。另外任務(wù)執(zhí)行情況和物資盤點(diǎn)信息也要通過網(wǎng)絡(luò)以XML形式發(fā)送到管理調(diào)度計(jì)算機(jī)節(jié)點(diǎn),最后這些信息存儲在人大金倉數(shù)據(jù)庫服務(wù)器中。不僅僅系統(tǒng)本身存在數(shù)據(jù)交換,與外系統(tǒng)之間也存在數(shù)據(jù)交換的需求,物資管理調(diào)度系統(tǒng)需要提供網(wǎng)絡(luò)接收外部系統(tǒng)的基礎(chǔ)數(shù)據(jù)信息,比如人員、單位、任務(wù)等數(shù)據(jù)信息。此外物資管理調(diào)度系統(tǒng)還需將一些數(shù)據(jù)信息發(fā)布出去,供其他系統(tǒng)使用,這些信息在各系統(tǒng)之間進(jìn)行交換時,都是以XML協(xié)議作為數(shù)據(jù)交換的載體。
該物資管理調(diào)度系統(tǒng)所在的數(shù)字化平臺數(shù)據(jù)來源復(fù)雜,信息量巨大,包括外圍設(shè)備的實(shí)時采集數(shù)據(jù)、設(shè)備信息、調(diào)度過程數(shù)據(jù)、盤庫信息等,需要對其中的關(guān)鍵數(shù)據(jù)信息進(jìn)行持久保存和在進(jìn)程間進(jìn)行傳輸。借鑒前期項(xiàng)目采用基于.net的自帶序列化反序列庫[3]可以解決此類問題。XML序列化就是將對象狀態(tài)轉(zhuǎn)換為XML文件,反序列化則是將XML文件轉(zhuǎn)換為對象實(shí)例,這兩個過程可以輕松實(shí)現(xiàn)存儲和傳輸數(shù)據(jù)[4]。
本文提出一種基于Qt跨平臺的XML序列化反序列化框架來解決國產(chǎn)操作系統(tǒng)平臺間的數(shù)據(jù)交換和共享問題,該框架擴(kuò)展性強(qiáng),成員變量可以為基礎(chǔ)數(shù)據(jù)類型(Int、QString、QBool、QDateTime等)、集合類型(QList、QMap等)以及自定義類型(指針)實(shí)現(xiàn)XML序列化反序列化功能,有效解決了信息存儲、傳輸和共享的問題。
利用面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承以及虛函數(shù)概念[5],結(jié)合Qt中元對象機(jī)制,自研對業(yè)務(wù)軟件提供的XML序列化和反序列化功能。下面對XML序列化和反序列化算法設(shè)計(jì)分別進(jìn)行詳細(xì)說明。
XML序列化就是通過對外接口將類對象轉(zhuǎn)化為可以網(wǎng)絡(luò)傳輸或者本地保存的XML文件,核心思想是將類的名稱映射成XML文件的根節(jié)點(diǎn)元素;不同類型的各成員變量名稱映射為XML文件的屬性名稱;成員變量的值映射為xml文件內(nèi)的屬性值;對于成員變量為基礎(chǔ)數(shù)據(jù)類型的變量較容易映射,但是集合類型(QList、QMap等)以及自定義類型(指針)需要進(jìn)行復(fù)雜的嵌套循環(huán)和基類指針調(diào)用;下面對XML序列化功能設(shè)計(jì)相關(guān)的自研函數(shù)進(jìn)行詳細(xì)說明,見表1所示。
圖1:序列化功能內(nèi)部函數(shù)之間調(diào)用圖
其中函數(shù)InstanceToXml()為序列化功能的唯一對外接口,實(shí)現(xiàn)將類實(shí)例轉(zhuǎn)換為XML文件,函數(shù)與函數(shù)之間的調(diào)用關(guān)系見圖1所示。
XML序列化功能內(nèi)部主要函數(shù)接口instanceToXml的實(shí)現(xiàn)流程主要分以下步驟,詳細(xì)流程如圖2所示。
(1)首先獲取待序列化實(shí)例的元對象(MetaObj);
(2)通過元對象(MetaObj)得到序列化類的N個公有成員變量;
(3)依次遍歷N個公有成員變量,并且判斷當(dāng)前成員變量是什么類型;
(4)若為list集合類型,調(diào)用listToXml函數(shù)進(jìn)行增加相應(yīng)節(jié)點(diǎn);
(5)若為map集合類型,調(diào)用mapToXml函數(shù)進(jìn)行增加相應(yīng)節(jié)點(diǎn);
(6)若為int、string、bool等基礎(chǔ)類型,直接增加相應(yīng)xml節(jié)點(diǎn)即可;
(7)若為自定義類型,使用該函數(shù)迭代即可;
(8)遍歷完所有成員變量,函數(shù)退出。
表1:序列化相關(guān)函數(shù)及說明
表2:反序列化相關(guān)函數(shù)及說明
表3:某調(diào)度臺位配置信息(ConsoleConfig)結(jié)構(gòu)
XML反序列化是XML序列化的反過程,通過對外接口將網(wǎng)絡(luò)傳輸中XML文件流或者本地保存的XML文件轉(zhuǎn)化類對象,核心思想是將XML文件的根節(jié)點(diǎn)元素映射成類的名稱;XML文件的屬性名稱映射為不同類型的各成員變量名稱;XML文件內(nèi)的屬性值映射為成員變量的值;對于XML文件或流存在嵌套或者重復(fù)結(jié)構(gòu)映射比較復(fù)雜,即映射為類中集合類型(QList、QMap等)以及自定義類型(指針)的成員變量;接下來對XML反序列化功能設(shè)計(jì)相關(guān)的自研函數(shù)進(jìn)行詳細(xì)說明,見表2所示。
圖2:序列化---虛函數(shù)instanceToXml()流程圖
圖3:反序列化功能內(nèi)部函數(shù)之間調(diào)用圖
圖4:反序列化---虛函數(shù)xmlToInstanse()流程圖
圖5:XML序列化上層調(diào)用代碼
其中函數(shù)XmlToInstance()為反序列化功能的唯一對外接口,實(shí)現(xiàn)將XML文件轉(zhuǎn)換為類實(shí)例,函數(shù)與函數(shù)之間的調(diào)用關(guān)系見圖3所示。XML反序列化功能內(nèi)部主要函數(shù)接口xmlToInstance()的實(shí)現(xiàn)流程主要分以下步驟,詳細(xì)流程如圖4所示:
(1)首先獲取待反序列化的XML文件的根節(jié)點(diǎn)或者自定義類型根節(jié)點(diǎn);
圖6:生成“ConsoleConfig.xml”文件
圖7:XML反序列化上層調(diào)用代碼
圖8:反序列化程序運(yùn)行結(jié)果
(2)獲取實(shí)例元對象,并通過元對象得到N個公有成員變量;
(3)依次遍歷N個公有成員變量,通過當(dāng)前成員變量名,使用compareTagName()函數(shù)返回相對應(yīng)結(jié)點(diǎn),接下來判斷成員變量的類型,并且一一賦值;
(4)若為list集合類型,調(diào)用xmlToList函數(shù)對相同成員變量賦值;
(5)若為map集合類型,調(diào)用xmlToMap函數(shù)對相同成員變量賦值;
(6)若為int、string、bool等基礎(chǔ)類型,對當(dāng)前成員變量賦值;
(7)若為自定義類型,使用該函數(shù)迭代并對當(dāng)前指針變量字段進(jìn)行賦值;
(8)遍歷完所有成員變量,函數(shù)退出。
在中標(biāo)麒麟操作系統(tǒng)桌面版V6.0上,以某調(diào)度臺位配置信息為例進(jìn)行仿真說明,該調(diào)度臺配置信息類(ConsoleConfig)包含了字符串、布爾、時間、集合及自定義類型等類型,具體類結(jié)構(gòu)如表3所示。
首先定義ConsoleConfig類并且對其進(jìn)行初始化,然后使用序列化功能接口,具體代碼如圖5所示,運(yùn)行程序后生成“ConsoleConfig. xml”文件,如圖6所示。
接下來將序列化程序生成的“ConsoleConfig. xml”文件進(jìn)行反序列化,具體代碼如圖7所示,程序運(yùn)行結(jié)果如圖8所示。
根據(jù)運(yùn)行結(jié)果看出使用該序列化反序列化方法可以完成相應(yīng)功能,滿足預(yù)期效果。
本文利用面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承以及虛函數(shù)概念,結(jié)合Qt中元對象機(jī)制,在國產(chǎn)中標(biāo)麒麟操作系統(tǒng)上設(shè)計(jì)開發(fā)出一套XML序列化反序列化框架,該框架可擴(kuò)展性和維護(hù)性強(qiáng)并且支持的數(shù)據(jù)類型(基礎(chǔ)類型、集合類型以及自定義類型等)較豐富,可滿足大部分物資調(diào)度管理系統(tǒng)業(yè)務(wù)軟件的使用需求,提高了軟件開發(fā)效率和軟件產(chǎn)品質(zhì)量。