王玉龍 寧蒙 王衛濤
(中國船舶集團公司第七一三研究所 河南省鄭州市 450015)
在某型號物資管理調度系統中,既有基于國產平臺的中標麒麟操作系統[1],也有基于安卓平臺的嵌入式系統,在每個計算機節點中需將啟動信息、運行信息等進行本地化,并且部分節點之間通過網絡以XML形式傳輸給任務接收終端,任務接收后需要將數據本地化及存儲至人大金倉數據庫[2]。另外任務執行情況和物資盤點信息也要通過網絡以XML形式發送到管理調度計算機節點,最后這些信息存儲在人大金倉數據庫服務器中。不僅僅系統本身存在數據交換,與外系統之間也存在數據交換的需求,物資管理調度系統需要提供網絡接收外部系統的基礎數據信息,比如人員、單位、任務等數據信息。此外物資管理調度系統還需將一些數據信息發布出去,供其他系統使用,這些信息在各系統之間進行交換時,都是以XML協議作為數據交換的載體。
該物資管理調度系統所在的數字化平臺數據來源復雜,信息量巨大,包括外圍設備的實時采集數據、設備信息、調度過程數據、盤庫信息等,需要對其中的關鍵數據信息進行持久保存和在進程間進行傳輸。借鑒前期項目采用基于.net的自帶序列化反序列庫[3]可以解決此類問題。XML序列化就是將對象狀態轉換為XML文件,反序列化則是將XML文件轉換為對象實例,這兩個過程可以輕松實現存儲和傳輸數據[4]。
本文提出一種基于Qt跨平臺的XML序列化反序列化框架來解決國產操作系統平臺間的數據交換和共享問題,該框架擴展性強,成員變量可以為基礎數據類型(Int、QString、QBool、QDateTime等)、集合類型(QList、QMap等)以及自定義類型(指針)實現XML序列化反序列化功能,有效解決了信息存儲、傳輸和共享的問題。
利用面向對象程序設計中的繼承以及虛函數概念[5],結合Qt中元對象機制,自研對業務軟件提供的XML序列化和反序列化功能。下面對XML序列化和反序列化算法設計分別進行詳細說明。
XML序列化就是通過對外接口將類對象轉化為可以網絡傳輸或者本地保存的XML文件,核心思想是將類的名稱映射成XML文件的根節點元素;不同類型的各成員變量名稱映射為XML文件的屬性名稱;成員變量的值映射為xml文件內的屬性值;對于成員變量為基礎數據類型的變量較容易映射,但是集合類型(QList、QMap等)以及自定義類型(指針)需要進行復雜的嵌套循環和基類指針調用;下面對XML序列化功能設計相關的自研函數進行詳細說明,見表1所示。

圖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)遍歷完所有成員變量,函數退出。

表1:序列化相關函數及說明

表2:反序列化相關函數及說明

表3:某調度臺位配置信息(ConsoleConfig)結構
XML反序列化是XML序列化的反過程,通過對外接口將網絡傳輸中XML文件流或者本地保存的XML文件轉化類對象,核心思想是將XML文件的根節點元素映射成類的名稱;XML文件的屬性名稱映射為不同類型的各成員變量名稱;XML文件內的屬性值映射為成員變量的值;對于XML文件或流存在嵌套或者重復結構映射比較復雜,即映射為類中集合類型(QList、QMap等)以及自定義類型(指針)的成員變量;接下來對XML反序列化功能設計相關的自研函數進行詳細說明,見表2所示。

圖2:序列化---虛函數instanceToXml()流程圖

圖3:反序列化功能內部函數之間調用圖

圖4:反序列化---虛函數xmlToInstanse()流程圖

圖5:XML序列化上層調用代碼
其中函數XmlToInstance()為反序列化功能的唯一對外接口,實現將XML文件轉換為類實例,函數與函數之間的調用關系見圖3所示。XML反序列化功能內部主要函數接口xmlToInstance()的實現流程主要分以下步驟,詳細流程如圖4所示:
(1)首先獲取待反序列化的XML文件的根節點或者自定義類型根節點;

圖6:生成“ConsoleConfig.xml”文件

圖7:XML反序列化上層調用代碼

圖8:反序列化程序運行結果
(2)獲取實例元對象,并通過元對象得到N個公有成員變量;
(3)依次遍歷N個公有成員變量,通過當前成員變量名,使用compareTagName()函數返回相對應結點,接下來判斷成員變量的類型,并且一一賦值;
(4)若為list集合類型,調用xmlToList函數對相同成員變量賦值;
(5)若為map集合類型,調用xmlToMap函數對相同成員變量賦值;
(6)若為int、string、bool等基礎類型,對當前成員變量賦值;
(7)若為自定義類型,使用該函數迭代并對當前指針變量字段進行賦值;
(8)遍歷完所有成員變量,函數退出。
在中標麒麟操作系統桌面版V6.0上,以某調度臺位配置信息為例進行仿真說明,該調度臺配置信息類(ConsoleConfig)包含了字符串、布爾、時間、集合及自定義類型等類型,具體類結構如表3所示。
首先定義ConsoleConfig類并且對其進行初始化,然后使用序列化功能接口,具體代碼如圖5所示,運行程序后生成“ConsoleConfig. xml”文件,如圖6所示。
接下來將序列化程序生成的“ConsoleConfig. xml”文件進行反序列化,具體代碼如圖7所示,程序運行結果如圖8所示。
根據運行結果看出使用該序列化反序列化方法可以完成相應功能,滿足預期效果。
本文利用面向對象程序設計中的繼承以及虛函數概念,結合Qt中元對象機制,在國產中標麒麟操作系統上設計開發出一套XML序列化反序列化框架,該框架可擴展性和維護性強并且支持的數據類型(基礎類型、集合類型以及自定義類型等)較豐富,可滿足大部分物資調度管理系統業務軟件的使用需求,提高了軟件開發效率和軟件產品質量。