戚艷兵 楊佳
摘要:作為提高軟件開發(fā)效率和開發(fā)質(zhì)量的一種技術(shù),代碼生成技術(shù)一直受到軟件開發(fā)人員的重視。針對用于數(shù)據(jù)序列化的代碼生成技術(shù)在可移植性及封裝、解析效率等方面的問題,設(shè)計了一種可以快速生成數(shù)據(jù)序列化或反序列化代碼的方法。該方法以協(xié)議原型定義文件為基本輸入,通過嚴格高效的轉(zhuǎn)換策略,自動生成數(shù)據(jù)序列化或反序列化、日志以及邊界檢查等代碼。該方法具有數(shù)據(jù)結(jié)構(gòu)輕便高效、代碼易于移植以及二進制數(shù)據(jù)流傳輸方式等優(yōu)點。通過實際項目應(yīng)用表明,該數(shù)據(jù)序列化代碼生成技術(shù)有效提高了嵌入式應(yīng)用軟件的開發(fā)效率及可移植性,并且實現(xiàn)了嵌入式平臺之間數(shù)據(jù)的高效可靠傳輸。
關(guān)鍵詞:代碼生成;序列化;邊界檢查;嵌入式平臺
中圖分類號:TP311文獻標志碼:A文章編號:1008-1739(2019)13-52-4
0引言
在通信與電子信息行業(yè),數(shù)據(jù)序列化技術(shù)一直是數(shù)據(jù)交換的重要組成部分[1]。尤其是在嵌入式軟件開發(fā)過程中,隨著規(guī)模的擴大和設(shè)計復(fù)雜度的提高,用戶需求或軟件設(shè)計框架變更的成本也越來越高,尤其是作為軟件工程重要組成部分的數(shù)據(jù)交換模塊,變更在所難免。加上大型軟件開發(fā)通常由很多人共同參與,編碼風格難以統(tǒng)一,編碼水平參差不齊,尤其是在數(shù)據(jù)序列化和參數(shù)邊界檢查過程中,容易出現(xiàn)問題。如何在保證系統(tǒng)可靠性和穩(wěn)定性的同時提高軟件開發(fā)效率,已經(jīng)成為嵌入式軟件開發(fā)中的重要問題。
代碼生成技術(shù)是一種利用程序生成代碼的技術(shù)[2],與手工書寫代碼相比,有效解決了人工編寫軟件代碼工作量大、錯誤率高的問題,大大提高了軟件開發(fā)效率和代碼質(zhì)量,降低了軟件開發(fā)風險。針對現(xiàn)有嵌入式平臺代碼生成器框架生成代碼固化[3-4]、無法體現(xiàn)業(yè)務(wù)過程以及使用不夠靈活等特點,提出了一種針對嵌入式平臺的數(shù)據(jù)序列化代碼生成方法。提供一種用來序列化結(jié)構(gòu)化數(shù)據(jù)的代碼生成方法,可以使用該技術(shù)將格式化協(xié)議序列化或反序列化成需要傳輸?shù)臄?shù)據(jù)流。提供了統(tǒng)一且跨平臺的應(yīng)用程序編程接口API,為嵌入式環(huán)境下的協(xié)議處理提供高效、靈活、具備嚴格邊界檢查的代碼生成技術(shù)。
1數(shù)據(jù)序列化代碼生成技術(shù)設(shè)計
嵌入式平臺的數(shù)據(jù)序列化代碼生成方法要考慮的需求[5-6]主要有運行效率、穩(wěn)定性和系統(tǒng)的開發(fā)效率。為了實現(xiàn)更簡單、更準確且更快捷的開發(fā),系統(tǒng)的可維護性一方面要盡量減少代碼中的循環(huán)和判斷分支,另外一方面是對通信協(xié)議進行修改不應(yīng)導(dǎo)致需要重新編譯整個系統(tǒng),對代碼量和風格進行有效管理;改進后的系統(tǒng)應(yīng)該提供方便統(tǒng)一的API。
數(shù)據(jù)序列化代碼生成框架如圖1所示,協(xié)議原型定義文件用于描述通信協(xié)議報文格式,輸入?yún)f(xié)議原型定義文件后需要對其進行檢查,協(xié)議解析模塊則負責將協(xié)議原型定義文件規(guī)范為代碼生成器能夠理解的格式,再根據(jù)模板引擎翻譯的設(shè)計模板結(jié)合系統(tǒng)參數(shù)生成對應(yīng)的代碼。整個過程實現(xiàn)了將軟件平臺無關(guān)的協(xié)議報文格式翻譯成平臺相關(guān)的數(shù)據(jù)序列化代碼的過程。
1.1協(xié)議原型定義文件設(shè)計
數(shù)據(jù)通信過程中,需要采用一定的通信協(xié)議報文格式,而作為描述通信協(xié)議報文格式的一種手段,需要用到協(xié)議原型定義文件。只有收發(fā)雙方遵循約定好的固定格式收發(fā)數(shù)據(jù),平臺才能夠?qū)笪倪M行序列化和反序列化。
針對嵌入式平臺,通過設(shè)計自定義的描述性語言來良好地定義程序中需要用到數(shù)據(jù)格式。為了讓代碼生成方法實現(xiàn)高效靈活,使用的協(xié)議格式定義盡可能簡化。對應(yīng)協(xié)議原型文件,一個數(shù)據(jù)流稱之為一個“message”,一個“message”對應(yīng)一個C程序中的結(jié)構(gòu)體,“message”之間可以嵌套;“message”中的每一行稱之為一個字段,一個字段描述一個程序中的數(shù)據(jù)類型,每個字段對應(yīng)若干個字段標簽。
為了能夠準確描述每個字段的特征,需要對字段類型、字段聲明和字段標簽進行定義。為了支持跨平臺操作,需要根據(jù)字段特征對運行平臺的各個數(shù)據(jù)類型進行重新定義和內(nèi)存分配,根據(jù)父子數(shù)據(jù)流之間的關(guān)系判定每個字段的優(yōu)先級和嵌套關(guān)系。字段標簽還描述了字段的邊界特征,通過定義default,min,max,step標簽來規(guī)范字段數(shù)據(jù)的有效范圍,從而利用代碼生成器生成判斷序列化或反序列化的相關(guān)字段是否合法的代碼。
原型定義文件的數(shù)據(jù)結(jié)構(gòu)如下:
1.2模板庫框架設(shè)計
通用的代碼生成系統(tǒng)模板原理是把靜態(tài)內(nèi)容寫成模板[7-8],把動態(tài)內(nèi)容用特殊標記嵌在模板內(nèi),然后通過代碼生成器將動態(tài)標記賦值,即可生成按照模板定制生成具體文件[9-10]。
不同于基于通用模板的代碼生成系統(tǒng),針對嵌入式平臺的數(shù)據(jù)交換格式化需求,設(shè)計了一套由操作系統(tǒng)抽象層、功能模板層和代碼模板層自下而上組成的模板庫,如圖2所示。
操作系統(tǒng)抽象層主要針對嵌入式平臺的系統(tǒng)API和內(nèi)存等特性進行管理。為了支持跨平臺操作,需要對操作系統(tǒng)進行抽象,根據(jù)字段類型針對平臺的各個數(shù)據(jù)類型進行重新定義,進行內(nèi)存管理,提供調(diào)試所需的底層函數(shù),檢測大小端模式并對不同平臺的系統(tǒng)API函數(shù)進行封裝、抽象。操作系統(tǒng)抽象層為功能模板層和代碼模板層提供了統(tǒng)一的接口使得生成的代碼滿足跨平臺數(shù)據(jù)交換格式化的需求。功能模板層作為中間層,主要為代碼模板層提供功能庫支持,如序列化與反序列化、日志輸出、邊界檢查以及功能開關(guān)等功能模板供上層調(diào)用。代碼模板層根據(jù)功能模板層和操作系統(tǒng)抽象層提供的內(nèi)容,通過代碼生成器對動態(tài)標記進行賦值,完成最終的代碼,并且能夠根據(jù)需要方便快捷地生成對應(yīng)平臺下的動態(tài)、靜態(tài)鏈接庫。
1.3代碼生成模塊
根據(jù)協(xié)議原型定義文件描述通信協(xié)議報文格式,利用協(xié)議檢查模塊對輸入進行詳細檢查。然后,協(xié)議解析模塊負責將協(xié)議原型定義文件規(guī)范為代碼生成器能夠理解的格式,再結(jié)合用戶的輸入?yún)?shù),如大小端選擇,是否生成日志打印等參數(shù)輸入,選擇對應(yīng)的代碼模板以及模板引擎,進行翻譯生成對應(yīng)的代碼,實現(xiàn)將軟件平臺無關(guān)的協(xié)議報文格式翻譯成平臺相關(guān)的數(shù)據(jù)序列化代碼的過程,開發(fā)人員可對生成的代碼進行修改。
生成的代碼接口包括初始化協(xié)議結(jié)構(gòu)體函數(shù)接口;負責網(wǎng)絡(luò)字節(jié)序、主機字節(jié)序轉(zhuǎn)換函數(shù)接口;負責日志輸出函數(shù)接口;協(xié)議結(jié)構(gòu)體到序列化數(shù)據(jù)流的封裝代碼(序列化),序列化數(shù)據(jù)流到協(xié)議結(jié)構(gòu)體的解析代碼(反序列化);負責字段的參數(shù)范圍檢查函數(shù)接口。例如,對于每個字段會生成一個參數(shù)范圍檢查函數(shù)(check)、一個獲取最大值函數(shù)(get_max_value)、一個獲取最小值函數(shù)(get_min_value)以及一個獲取默認值函數(shù)(get_default_value)。
2數(shù)據(jù)序列化代碼生成技術(shù)對比
序列化技術(shù)的發(fā)展從傳統(tǒng)的具有可讀性、結(jié)構(gòu)嚴謹?shù)腦ML,到輕量級的數(shù)據(jù)交換格式JSON,再到Google的Protobuf,序列化領(lǐng)域里,各種解決方案都在不斷地改進和優(yōu)化以適應(yīng)大數(shù)據(jù)時代的需求。
為了驗證本文提出的代碼生成技術(shù)在數(shù)據(jù)序列化方面的性能,提出了一個基于嵌入式平臺的基準化性能分析方案,選取了目前常用的序列化工具,包括XML,JSON,Google的proto-buf,用來測試其在嵌入式平臺下的性能。測試環(huán)境:MPC8360,基于powerpc e300核心,主頻533 Hz,512 M DDR2 SDRAM,Linux版本:2.6.30。所有工具均使用同一段協(xié)議數(shù)據(jù)。為了保證公平性,實例的所有字段都必須被解析,并且需要在不對字段進行壓縮的情況下進行,測試數(shù)據(jù)如圖3和圖4所示。
圖3中總時間開銷包括創(chuàng)建對象、序列化以及反序列化的總時間;單位ns。在給定條件下,綜合圖3性能數(shù)據(jù)對比可以發(fā)現(xiàn),對于一條消息數(shù)據(jù),XML,JSON的總時間開銷最長,而PROTO-BUF耗時較短,本文方法耗時最短。
圖4的字節(jié)數(shù)表示對象序列化之后的長度,即所占空間大小。在給定條件下,綜合圖4性能數(shù)據(jù)對比可以發(fā)現(xiàn),對于一條消息數(shù)據(jù),XML,JSON生成的消息長度最長,而PROTO-BUF較短,本文方法生成的消息長度最短。驗證結(jié)果表明,本文提出的針對數(shù)據(jù)序列化的代碼生成技術(shù)在嵌入式平臺的應(yīng)用中與現(xiàn)有技術(shù)相比在時間和空間開銷上有一定的優(yōu)勢。而嵌入式領(lǐng)域中,時間和空間的開銷是2個極其重要的指標。
3應(yīng)用實例
為了驗證數(shù)據(jù)序列化代碼生成技術(shù)能夠有效提高嵌入式應(yīng)用軟件的開發(fā)效率及可擴展性,實現(xiàn)了嵌入式平臺之間數(shù)據(jù)的高效和可靠傳輸,選取了實際應(yīng)用的基于網(wǎng)管代理與站控應(yīng)用管理系統(tǒng),開發(fā)基于嵌入式IMX6Q核心板卡,操作系統(tǒng)為Linux。網(wǎng)管代理與站控應(yīng)用管理系統(tǒng)負責完成對遠端站站內(nèi)本地通信設(shè)備的監(jiān)視與控制管理,并將本地設(shè)備參數(shù)及狀態(tài)向中心站設(shè)備管理系統(tǒng)發(fā)送,接收中心站的監(jiān)視管理。網(wǎng)管代理與站控應(yīng)用管理系統(tǒng)具備實時監(jiān)控、快速響應(yīng)和使用方便等特點。該平臺的數(shù)據(jù)序列化/反序列化使用了數(shù)據(jù)序列化代碼生成技術(shù)來實現(xiàn)。
網(wǎng)管代理與站控軟件采用B/S模式軟件架構(gòu),該系統(tǒng)由6個子系統(tǒng)構(gòu)成:Web訪問服務(wù)、訪問控制單元、數(shù)據(jù)庫(DB)、數(shù)據(jù)訪問服務(wù)單元、設(shè)備采集單元以及日志管理單元組成。每個軟件單元又包含多個實現(xiàn)具體功能的軟件模塊,系統(tǒng)結(jié)構(gòu)如圖5所示。
Web訪問服務(wù)負責與用戶進行交互,配置和監(jiān)控設(shè)備與鏈路信息。訪問控制單元負責協(xié)議轉(zhuǎn)換,分發(fā)指令。數(shù)據(jù)訪問服務(wù)單元為網(wǎng)管代理與站控軟件提供數(shù)據(jù)庫讀、寫訪問操作支持,為其他內(nèi)部軟件模塊提供公共的數(shù)據(jù)庫訪問能力。設(shè)備采集單元是站控軟件的前端處理進程,負責采集被管設(shè)備的運行參數(shù)、生成告警事件以及向被管設(shè)備轉(zhuǎn)發(fā)用戶的設(shè)備控制命令。日志管理單元支持包括運行日志、操作日志、通信日志及告警日志等信息。
Web訪問服務(wù)與訪問控制單元、訪問控制單元與設(shè)備采集單元、設(shè)備采集單元與數(shù)據(jù)訪問服務(wù)單元之間的數(shù)據(jù)交互均采用數(shù)據(jù)序列化代碼生成技術(shù),序列化業(yè)務(wù)數(shù)據(jù)流程如圖6所示。
通過代碼生成技術(shù)在該系統(tǒng)的數(shù)據(jù)序列化方面的應(yīng)用,基于業(yè)務(wù)過程的數(shù)據(jù)流能夠被快速實現(xiàn),為軟件的快速開發(fā)打下了良好的基礎(chǔ)。該系統(tǒng)軟件的設(shè)計更多的是對軟件框架和業(yè)務(wù)過程的綜合設(shè)計與實現(xiàn)。能夠快速開發(fā)軟件協(xié)議并能靈活應(yīng)對協(xié)議變化的方法在系統(tǒng)的軟件研發(fā)中占據(jù)重要地位,基于本文代碼生成技術(shù)的優(yōu)勢是用戶根據(jù)需求自定義分層模板,分層結(jié)構(gòu)使其易于復(fù)用;模板作為代碼的原型,生成的代碼可讀性強;模板與數(shù)據(jù)分離,當需修改代碼時,只需修改模板,易于維護。測試結(jié)果表明,該數(shù)據(jù)傳輸協(xié)議實現(xiàn)了網(wǎng)關(guān)和應(yīng)用數(shù)據(jù)平臺之間數(shù)據(jù)的高效和可靠傳輸。
4結(jié)束語
針對嵌入式平臺的數(shù)據(jù)序列化需求,本文提出了一種代碼生成方法,使用該方法能夠?qū)⒓s定的通信協(xié)議序列化或反序列化成需要傳輸?shù)亩M制數(shù)據(jù)流。該方法以協(xié)議原型定義文件為基本輸入,通過嚴格高效的轉(zhuǎn)換策略,自動生成數(shù)據(jù)序列化或反序列化、日志輸出以及邊界檢查等代碼。生成的代碼具有一致的應(yīng)用程序編程接口API,能夠為嵌入式環(huán)境下的協(xié)議處理提供高效、靈活、嚴格的邊界檢查服務(wù)。代碼具有良好的可讀性及可維護性,通過代碼生成工具的使用,極大地縮短了開發(fā)人員的工作量,有效提升了系統(tǒng)開發(fā)的效率、可維護性和可移植性。最后,在網(wǎng)管代理與站控的通信系統(tǒng)中,針對各個單元之間的數(shù)據(jù)序列化需求,引入了本文提出的代碼生成技術(shù),在實際應(yīng)用中得到了充分驗證。
參考文獻
[1]史棟杰.五種快速序列化框架的性能比較[J].電腦知識與技術(shù),2010, 6(34):9710-9711.
[2]肖寒.J2EE平臺下代碼自動生成技術(shù)研究[J].電腦知識與技術(shù),2009,5(20): 5421-5422,5434.
[3]張濤,黃強,毛磊雅,等.一個基于JSON的對象序列化算法[J].計算機工程與應(yīng)用,2007,43(15):98-100,133.
[4]管太陽.基于模板的自動代碼生成技術(shù)的研究[D].成都:電子科技大學,2007.
[5]王海波,耿暉,姜吉發(fā),等.基于XML的數(shù)據(jù)交換的實現(xiàn)[J].計算機應(yīng)用,2001, 21(4): 67-68.
[6]董玉明.代碼生成技術(shù)在管理信息系統(tǒng)開發(fā)中的研究與應(yīng)用[D].長春:吉林大學,2012.
[7]劉青.基于Protocol Buffer的即時通信監(jiān)控系統(tǒng)設(shè)計與實現(xiàn)[D].武漢:華中科技大學,2013.
[8]魯杰,王永斌,劉宏波.基于XML的報務(wù)系統(tǒng)數(shù)據(jù)分發(fā)機制研究[J].計算機工程與設(shè)計, 2010, 31(12): 2707-2709.
[9] Alonso D,Vicente-Chicote C,Sanchez P,et al. Automatic Ada Code Generation Using a Model-Driven Engineering Approach[J]. Lecture notes in Computer Science,2007(4498): 168-179.
[10]胡晨光,嚴捷豐,高正東,等.一種類的序列化與反序列化框架[J].電腦知識與技術(shù),2009,5(24):6739-6741.