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