代码生成技术在数据序列化方面的应用

2019-09-10 07:22戚艳兵杨佳
计算机与网络 2019年13期
关键词:序列化

戚艳兵 杨佳

摘要:作为提高软件开发效率和开发质量的一种技术,代码生成技术一直受到软件开发人员的重视。针对用于数据序列化的代码生成技术在可移植性及封裝、解析效率等方面的问题,设计了一种可以快速生成数据序列化或反序列化代码的方法。该方法以协议原型定义文件为基本输入,通过严格高效的转换策略,自动生成数据序列化或反序列化、日志以及边界检查等代码。该方法具有数据结构轻便高效、代码易于移植以及二进制数据流传输方式等优点。通过实际项目应用表明,该数据序列化代码生成技术有效提高了嵌入式应用软件的开发效率及可移植性,并且实现了嵌入式平台之间数据的高效可靠传输。

关键词:代码生成;序列化;边界检查;嵌入式平台

中图分类号:TP311文献标志码:A文章编号:1008-1739(2019)13-52-4

0引言

在通信与电子信息行业,数据序列化技术一直是数据交换的重要组成部分[1]。尤其是在嵌入式软件开发过程中,随着规模的扩大和设计复杂度的提高,用户需求或软件设计框架变更的成本也越来越高,尤其是作为软件工程重要组成部分的数据交换模块,变更在所难免。加上大型软件开发通常由很多人共同参与,编码风格难以统一,编码水平参差不齐,尤其是在数据序列化和参数边界检查过程中,容易出现问题。如何在保证系统可靠性和稳定性的同时提高软件开发效率,已经成为嵌入式软件开发中的重要问题。

代码生成技术是一种利用程序生成代码的技术[2],与手工书写代码相比,有效解决了人工编写软件代码工作量大、错误率高的问题,大大提高了软件开发效率和代码质量,降低了软件开发风险。针对现有嵌入式平台代码生成器框架生成代码固化[3-4]、无法体现业务过程以及使用不够灵活等特点,提出了一种针对嵌入式平台的数据序列化代码生成方法。提供一种用来序列化结构化数据的代码生成方法,可以使用该技术将格式化协议序列化或反序列化成需要传输的数据流。提供了统一且跨平台的应用程序编程接口API,为嵌入式环境下的协议处理提供高效、灵活、具备严格边界检查的代码生成技术。

1数据序列化代码生成技术设计

嵌入式平台的数据序列化代码生成方法要考虑的需求[5-6]主要有运行效率、稳定性和系统的开发效率。为了实现更简单、更准确且更快捷的开发,系统的可维护性一方面要尽量减少代码中的循环和判断分支,另外一方面是对通信协议进行修改不应导致需要重新编译整个系统,对代码量和风格进行有效管理;改进后的系统应该提供方便统一的API。

数据序列化代码生成框架如图1所示,协议原型定义文件用于描述通信协议报文格式,输入协议原型定义文件后需要对其进行检查,协议解析模块则负责将协议原型定义文件规范为代码生成器能够理解的格式,再根据模板引擎翻译的设计模板结合系统参数生成对应的代码。整个过程实现了将软件平台无关的协议报文格式翻译成平台相关的数据序列化代码的过程。

1.1协议原型定义文件设计

数据通信过程中,需要采用一定的通信协议报文格式,而作为描述通信协议报文格式的一种手段,需要用到协议原型定义文件。只有收发双方遵循约定好的固定格式收发数据,平台才能够对报文进行序列化和反序列化。

针对嵌入式平台,通过设计自定义的描述性语言来良好地定义程序中需要用到数据格式。为了让代码生成方法实现高效灵活,使用的协议格式定义尽可能简化。对应协议原型文件,一个数据流称之为一个“message”,一个“message”对应一个C程序中的结构体,“message”之间可以嵌套;“message”中的每一行称之为一个字段,一个字段描述一个程序中的数据类型,每个字段对应若干个字段标签。

为了能够准确描述每个字段的特征,需要对字段类型、字段声明和字段标签进行定义。为了支持跨平台操作,需要根据字段特征对运行平台的各个数据类型进行重新定义和内存分配,根据父子数据流之间的关系判定每个字段的优先级和嵌套关系。字段标签还描述了字段的边界特征,通过定义default,min,max,step标签来规范字段数据的有效范围,从而利用代码生成器生成判断序列化或反序列化的相关字段是否合法的代码。

原型定义文件的数据结构如下:

1.2模板库框架设计

通用的代码生成系统模板原理是把静态内容写成模板[7-8],把动态内容用特殊标记嵌在模板内,然后通过代码生成器将动态标记赋值,即可生成按照模板定制生成具体文件[9-10]。

不同于基于通用模板的代码生成系统,针对嵌入式平台的数据交换格式化需求,设计了一套由操作系统抽象层、功能模板层和代码模板层自下而上组成的模板库,如图2所示。

操作系统抽象层主要针对嵌入式平台的系统API和内存等特性进行管理。为了支持跨平台操作,需要对操作系统进行抽象,根据字段类型针对平台的各个数据类型进行重新定义,进行内存管理,提供调试所需的底层函数,检测大小端模式并对不同平台的系统API函数进行封装、抽象。操作系统抽象层为功能模板层和代码模板层提供了统一的接口使得生成的代码满足跨平台数据交换格式化的需求。功能模板层作为中间层,主要为代码模板层提供功能库支持,如序列化与反序列化、日志输出、边界检查以及功能开关等功能模板供上层调用。代码模板层根据功能模板层和操作系统抽象层提供的内容,通过代码生成器对动态标记进行赋值,完成最终的代码,并且能够根据需要方便快捷地生成对应平台下的动态、静态链接库。

1.3代码生成模块

根据协议原型定义文件描述通信协议报文格式,利用协议检查模块对输入进行详细检查。然后,协议解析模块负责将协议原型定义文件规范为代码生成器能够理解的格式,再结合用户的输入参数,如大小端选择,是否生成日志打印等参数输入,选择对应的代码模板以及模板引擎,进行翻译生成对应的代码,实现将软件平台无关的协议报文格式翻译成平台相关的数据序列化代码的过程,开发人员可对生成的代码进行修改。

生成的代码接口包括初始化协议结构体函数接口;负责网络字节序、主机字节序转换函数接口;负责日志输出函数接口;协议结构体到序列化数据流的封装代码(序列化),序列化数据流到协议结构体的解析代码(反序列化);负责字段的参数范围检查函数接口。例如,对于每个字段会生成一个参数范围检查函数(check)、一个获取最大值函数(get_max_value)、一个获取最小值函数(get_min_value)以及一个获取默认值函数(get_default_value)。

2数据序列化代码生成技术对比

序列化技术的发展从传统的具有可读性、结构严谨的XML,到轻量级的数据交换格式JSON,再到Google的Protobuf,序列化领域里,各种解决方案都在不断地改进和优化以适应大数据时代的需求。

为了验证本文提出的代码生成技术在数据序列化方面的性能,提出了一個基于嵌入式平台的基准化性能分析方案,选取了目前常用的序列化工具,包括XML,JSON,Google的proto-buf,用来测试其在嵌入式平台下的性能。测试环境:MPC8360,基于powerpc e300核心,主频533 Hz,512 M DDR2 SDRAM,Linux版本:2.6.30。所有工具均使用同一段协议数据。为了保证公平性,实例的所有字段都必须被解析,并且需要在不对字段进行压缩的情况下进行,测试数据如图3和图4所示。

图3中总时间开销包括创建对象、序列化以及反序列化的总时间;单位ns。在给定条件下,综合图3性能数据对比可以发现,对于一条消息数据,XML,JSON的总时间开销最长,而PROTO-BUF耗时较短,本文方法耗时最短。

图4的字节数表示对象序列化之后的长度,即所占空间大小。在给定条件下,综合图4性能数据对比可以发现,对于一条消息数据,XML,JSON生成的消息长度最长,而PROTO-BUF较短,本文方法生成的消息长度最短。验证结果表明,本文提出的针对数据序列化的代码生成技术在嵌入式平台的应用中与现有技术相比在时间和空间开销上有一定的优势。而嵌入式领域中,时间和空间的开销是2个极其重要的指标。

3应用实例

为了验证数据序列化代码生成技术能够有效提高嵌入式应用软件的开发效率及可扩展性,实现了嵌入式平台之间数据的高效和可靠传输,选取了实际应用的基于网管代理与站控应用管理系统,开发基于嵌入式IMX6Q核心板卡,操作系统为Linux。网管代理与站控应用管理系统负责完成对远端站站内本地通信设备的监视与控制管理,并将本地设备参数及状态向中心站设备管理系统发送,接收中心站的监视管理。网管代理与站控应用管理系统具备实时监控、快速响应和使用方便等特点。该平台的数据序列化/反序列化使用了数据序列化代码生成技术来实现。

网管代理与站控软件采用B/S模式软件架构,该系统由6个子系统构成:Web访问服务、访问控制单元、数据库(DB)、数据访问服务单元、设备采集单元以及日志管理单元组成。每个软件单元又包含多个实现具体功能的软件模块,系统结构如图5所示。

Web访问服务负责与用户进行交互,配置和监控设备与链路信息。访问控制单元负责协议转换,分发指令。数据访问服务单元为网管代理与站控软件提供数据库读、写访问操作支持,为其他内部软件模块提供公共的数据库访问能力。设备采集单元是站控软件的前端处理进程,负责采集被管设备的运行参数、生成告警事件以及向被管设备转发用户的设备控制命令。日志管理单元支持包括运行日志、操作日志、通信日志及告警日志等信息。

Web访问服务与访问控制单元、访问控制单元与设备采集单元、设备采集单元与数据访问服务单元之间的数据交互均采用数据序列化代码生成技术,序列化业务数据流程如图6所示。

通过代码生成技术在该系统的数据序列化方面的应用,基于业务过程的数据流能够被快速实现,为软件的快速开发打下了良好的基础。该系统软件的设计更多的是对软件框架和业务过程的综合设计与实现。能够快速开发软件协议并能灵活应对协议变化的方法在系统的软件研发中占据重要地位,基于本文代码生成技术的优势是用户根据需求自定义分层模板,分层结构使其易于复用;模板作为代码的原型,生成的代码可读性强;模板与数据分离,当需修改代码时,只需修改模板,易于维护。测试结果表明,該数据传输协议实现了网关和应用数据平台之间数据的高效和可靠传输。

4结束语

针对嵌入式平台的数据序列化需求,本文提出了一种代码生成方法,使用该方法能够将约定的通信协议序列化或反序列化成需要传输的二进制数据流。该方法以协议原型定义文件为基本输入,通过严格高效的转换策略,自动生成数据序列化或反序列化、日志输出以及边界检查等代码。生成的代码具有一致的应用程序编程接口API,能够为嵌入式环境下的协议处理提供高效、灵活、严格的边界检查服务。代码具有良好的可读性及可维护性,通过代码生成工具的使用,极大地缩短了开发人员的工作量,有效提升了系统开发的效率、可维护性和可移植性。最后,在网管代理与站控的通信系统中,针对各个单元之间的数据序列化需求,引入了本文提出的代码生成技术,在实际应用中得到了充分验证。

参考文献

[1]史栋杰.五种快速序列化框架的性能比较[J].电脑知识与技术,2010, 6(34):9710-9711.

[2]肖寒.J2EE平台下代码自动生成技术研究[J].电脑知识与技术,2009,5(20): 5421-5422,5434.

[3]张涛,黄强,毛磊雅,等.一个基于JSON的对象序列化算法[J].计算机工程与应用,2007,43(15):98-100,133.

[4]管太阳.基于模板的自动代码生成技术的研究[D].成都:电子科技大学,2007.

[5]王海波,耿晖,姜吉发,等.基于XML的数据交换的实现[J].计算机应用,2001, 21(4): 67-68.

[6]董玉明.代码生成技术在管理信息系统开发中的研究与应用[D].长春:吉林大学,2012.

[7]刘青.基于Protocol Buffer的即时通信监控系统设计与实现[D].武汉:华中科技大学,2013.

[8]鲁杰,王永斌,刘宏波.基于XML的报务系统数据分发机制研究[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]胡晨光,严捷丰,高正东,等.一种类的序列化与反序列化框架[J].电脑知识与技术,2009,5(24):6739-6741.

猜你喜欢
序列化
如何让高中作文教学更有效?
九年一贯制学校德育工作序列化实践与探索
基于Netty的RPC通信系统的编解码技术研究
小学开展有效德育活动的策略与思考
序列化构建:综合实践活动常态实施的理性“突围”
序列化,铸就主题班会的“底子”
另辟蹊径,新坛有新酒
初中作文序列化训练之我见
初中生写作序列化实践与思考
分层次序列化训练增强考场写作的增分因素