高效自描述的复杂数据对象序列化方法技术

技术编号:10022029 阅读:462 留言:0更新日期:2014-05-09 03:42
本发明专利技术公开了一种高效自描述的复杂数据对象序列化方法,主要解决了现有技术中存在的对象序列化处理能力有限,使用和维护较为不便,缺乏统一和一致性的问题。该方法为每种异构消息创建一个用于标识其类型的唯一消息ID,并创建零个或一个以上用以标识各异构消息所需传递的属性值的参数,创建各参数的唯一ID、值类型和二进制保存的值内容,并根据异构消息的消息ID,采用二进制方式实现序列化和反序列化。通过上述方案,本发明专利技术达到了便于管理和维护,减少出错记录,提高数据处理能力的目的,具有很高的实用价值和推广价值。

【技术实现步骤摘要】
高效自描述的复杂数据对象序列化方法
本专利技术涉及一种复杂数据对象序列化方法,具体地说,是涉及一种高效自描述的复杂数据对象序列化方法。
技术介绍
对象序列化、反序列化是现代网络通讯和远程调用技术的基石,序列化方法将逻辑对象转换为数据包,通过网络发送到远端,远端服务器接收到数据包后,将其反序列化获得原始逻辑对象,再进行解析和处理。为了提高应用效果,要求序列化方法需达到性能、易用性、可扩展性各方面的平衡。目前业内使用最广泛、评价最高的是谷歌的ProtocolBuffers方案,它使用.proto文件定义序列化对象接口,根据proto定义生成序列化、反序列化接口代码,使用时用户程序调用接口代码进行序列化和反序列化操作,由于ProtocolBuffers使用二进制流编码,带宽占用和处理速度都远远强于传统的xml、json等方案,而且有前向兼容性,更新定义升级后不影响使用,接口设计也简单,所以是目前最受欢迎的序列化方案之一。但是对于大型通讯系统,ProtocolBuffers存在以下缺陷:ProtocolBuffers对于一些复杂类型,比如数组的数组、字符串数组等结构需要通过嵌套消息或者多次序列化来处理,处理性能会严重下降;ProtocolBuffers序列化数据仅保留数据部分,要成功反序列化接收端必须拥有同一份proto文件,根据文件里的消息定义才能解析,使用和维护都不方便;一个大型系统里通常会有非常多的对象需要序列化,但是ProtocolBuffers需要为每一种对象定义一个独立的proto文件,并生成一个独立的解析代码,在一个实际项目里,这样会产生非常多的额外文件,不利于代码管理,也缺乏统一和一致性。
技术实现思路
本专利技术的目的在于提供一种高效自描述的复杂数据对象序列化方法,主要解决现有技术中存在的对象序列化处理能力有限,使用和维护较为不便,缺乏统一和一致性的问题。为了实现上述目的,本专利技术采用的技术方案如下:高效自描述的复杂数据对象序列化方法,包括:为每种异构消息创建一个用于标识其类型的唯一消息ID,并创建零个或一个以上用以标识各异构消息所需传递的属性值的参数,创建各参数的唯一ID、值类型和二进制保存的值内容;序列化时:(1)将待序列化异构消息的消息ID用二进制方式保存在数据包头;(2)遍历异构消息的参数清单,依次将该异构消息的参数序列化为二进制格式追加至存储有消息ID的数据包,直至所有参数处理完毕,完成对该异构消息的序列化;反序列化时:(a)读取待反序列化的异构消息的消息ID;(b)依次读取该异构消息的参数类型,根据类型对参数的二进制数据包进行解码,获得参数值;(c)根据参数ID将获取的参数值进行保存,直至数据包读取完毕,完成对该异构消息的反序列化。进一步地,所述参数二进制格式由用于区分不同参数的key和标记参数值类型的value构成。与现有技术相比,本专利技术具有以下有益效果:(1)本专利技术中,无需独立定义文件和解析代码,一个大型系统内只需要维护一份参数值定义文件即可,便于统一管理、减少出错记录,且有效降低了维护难度,大幅度提高了复杂数据处理性能,符合实际需求。具体实施方式下面结合附图和实施例对本专利技术作进一步说明,本专利技术的实施方式包括但不限于下列实施例。实施例为了解决现有技术中存在的对象序列化处理能力有限,使用和维护较为不便,缺乏统一和一致性的问题,本专利技术公开了一种使用统一方法对各种异构消息进行序列化和反序列化处理,且序列化后的二进制数据流可以自我描述,无需接口文件和独立的编解码代码就可正确反序列化回原始对象、且适用于复杂数据对象的序列化方法。本专利技术中,每种异构消息都有一个唯一的消息ID,用来标识异构消息的类型,每个异构消息都包含零到多个参数,用来标识各种异构消息需要传递的属性值,每个参数都有自己的惟一ID、值类型和二进制保存的值内容,通过此种设置,序列化通过以下方式实现:首先将消息ID用二进制方式保存在数据包头,再遍历消息的参数清单,依次将参数序列化成二进制形式追加到数据包,参数全部处理完毕时,序列化完成;相应地,反序列化时,首先读取消息ID,然后依次读取参数类型,根据类型对参数的二进制数据包进行解码,获得参数值,并根据参数ID保存到内存中,数据包全部读取完毕,反序列化完成。根据不同的数据类型,本实施例中提供了相应的编码规则,如表1所示,常见的四个基本数据存储格式可如下:表1本专利技术中,优选使用二进制编码格式进行各异构消息的序列化、反序列化,各异构消息的二进制编码格式如下:每个消息都由一个messageid(消息ID)开始,使用variant格式保存;messageid后面跟随零到多个参数的二进制格式数据;参数二进制格式由key和value组成,key长度为2字节,高11位为paramid(参数ID),用于区分不同的参数,支持最多2048个参数;低5位为valuetype(值类型),标记参数值的类型,最多支持32种数据类型。如表2所示,值类型有多种可选值,可以根据实际情况扩展和自定义:表2类型值类型0Int整型1Uint无符号整型2Bool布尔类型3String字符串4Float单精度浮点数5IntArray整型数组6UIntArray无符号整型数组7FloatArray浮点数数组8StringArray字符串数组9ArrayofUIntArray无符号整型数组的数组10ArrayofStringArray字符串数组的数组11ArrayofFloatArray浮点数数组的数组value是参数值的二进制格式,根据不同的值类型,选择不同的编码方式。在上述基础上,序列化过程如下:读取对象messageid,使用variant编码写入;遍历对象属性,为每个属性选择合适的参数id,根据参数id和值类型,生成2字节key值,并根据算法:key=param_id<<5|value_type写入;根据值类型和属性值编码value的二进制格式并写入;对于UInt、Bool类型,使用variant编码存储;对于Int类型,先使用ZigZag编码转换后再使用variant编码存储;对于Float类型,使用4字节浮点数存储;对于String类型,获取字符串长度n,将n使用varint编码存储,再写入n字节二进制字符串;对于Array类型,获取数组个数n,将n使用varint编码存储,然后根据基础类型存储规则将n个值连续写入,如:IntArray:[3][int1][int2][int3]、StringArray:[2][string1][string2];对于ArrayofArray类型,获取母数组个数n,将n使用varint编码存储,然后遍历字数组,根据编码规则将各子数组编码写入,如:UintArrayofArray=[[1,2],[4,4,3]]编码为:[2][2][1][2][3][4][4][3];重复上述步骤,直到所有属性读取完毕,序列化完成。与之对应地,反序列化过程如下:读取一个variant值,获得对象messageid;读取2字节获得一个key值,根据算法:value_type=key_value&0x1F、param_id=key_value>>5从中拆分参数id和值类型;根本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.高效自描述的复杂数据对象序列化方法,其特征在于,包括:为每种异构消息创建一个用于标识其类型的唯一消息ID,并创建零个或一个以上用以标识各异构消息所需传递的属性值的参数,创建各参数的唯一ID、值类型和二进制保存的值内容;序列化时:(1)将待序列化异构消息的消息ID用二进制方式保存在数据包头;(2)遍历异构消息的参数清单,依次将该异构消息的参数序列化为二进制格式追加至存储有消息ID的数据包,直至所有参数处理完毕,完成对该异构消息的序列化;反序列化时:(a)读取待反序列化的异构消息的消息ID;...

【专利技术属性】
技术研发人员:黄睿
申请(专利权)人:成都致云科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1