1.本发明涉及二级制数据反序列化技术,尤其是涉及一种基于配置化的二进制数据反序列化方法、装置及存储介质。
背景技术:
2.在计算机领域,经常会需要用到二进制的序列化和反序列化过程,例如在在业务中经常出现需要处理与加工二进制数据的场景,这类基于内存布局而非规则的数据,如果为业界通用的数据传输格式,则通过引入第三方库实现,此时,由于反序列化不断引入第三方库,将会使项目体量不断膨胀提高维护成本。如果为私有或自定义的数据传输格式,则需要自行实现一个解析器实现从二进制数据到程序中对象的反序列化,这样又会导致相关代码难以复用且对维护也提出了更高的要求。
技术实现要素:
3.本发明的目的就是为了提供一种基于配置化的二进制数据反序列化方法、装置及存储介质,通过预配置反序列化指令的方式,采用多级信息的注解标记的方式,确定反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度,依次对二级制序列进行解析得到反序列化结果,提升了代码的可重用性,降低了反复开发的成本,同时将数据定义与解析解耦,便于随时替换或新增相关的反序列化器。
4.本发明的目的可以通过以下技术方案来实现:
5.一种基于配置化的二进制数据反序列化方法,包括:
6.读取二进制序列和对应于该二进制序列的注解标记,其中,所述注解标记包括类指令序列和对应于各类指令的注解指令序列;
7.根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度;
8.基于得到的反序列化指令序列解析所述二进制序列,并得到反序列化结果。
9.所述根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度,具体包括:
10.基于类指令序列排序各注解指令序列,其中,所述注解指令序列中的各注解指令至少含有元素名称、长度信息和对象类型定义;
11.基于各注解指令,根据其对象类型定义确定反序列化指令,以及根据其长度信息确定对应于该反序列化指令的二进制数据长度;
12.汇总各反序列化指令,并组成反序列化指令序列。
13.所述对象类型定义的类别至少包括:整型、浮点数、字符串、填充和数组。
14.所述对象类型定义为字符串的注解指令还包括编码集信息。
15.所述对象类型定义为整型、浮点数和字符串的注解指令还包括字节序信息。
16.所述对象类型定义的类别还包括复合类型。
17.所述长度信息的内容为比特长度值或元素名称,其中,当长度信息为元素名称时,其比特长度取该元素名称的解析结果。
18.所述类指令序列包括长度信息,用于表征其对应的注解指令序列的数量。
19.一种基于配置化的二进制数据反序列化装置,包括存储器、处理器,以及存储于所述存储器中的程序,所述处理器执行所述程序时实现如上述的方法。
20.所述程序被执行时实现如上述的方法。
21.与现有技术相比,本发明具有以下有益效果:
22.1、通过预配置反序列化指令的方式,采用多级信息的注解标记的方式,确定反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度,依次对二进制序列进行解析得到反序列化结果,提升了代码的可重用性,降低了反复开发的成本,同时将数据定义与解析解耦,便于随时替换或新增相关的反序列化器。
23.2、将二进制数据的结构与程序中的对象类型进行关联绑定,进一步提升了代码的可重用性,降低了反复开发的成本。
24.3、支持自我指涉,进一步提升了代码的可重用性,降低了反复开发的成本。
附图说明
25.图1为本发明的结构示意图。
具体实施方式
26.下面结合附图和具体实施例对本发明进行详细说明。本实施例以本发明技术方案为前提进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
27.在介绍本技术的具体实施方式之前,对以下术语进行说明:
28.二进制数据:二进制数据是指其单位只能采取两种可能状态的数据,根据二进制数字系统和布尔代数,传统上被标为0和1。
29.序列化:把对象转换成二进制数据,便于保存在内存、文件、数据库中。
30.反序列化:反序列化为序列化的逆过程,由二进制数据还原成对象。
31.解析:通过代码程序对数据进行读取并根据规则赋予其对应的含义。
32.本技术通过对二进制数据特点进行设计,对其数据格式的抽象,结合编程语言特性,提供了一种基于配置化的二进制数据反序列化方法,具体的,本技术提供的一种基于配置化的二进制数据反序列化方法,如图1所示,包括:
33.读取二进制序列和对应于该二进制序列的注解标记,其中,注解标记包括类指令序列和对应于各类指令的注解指令序列;
34.根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度;
35.基于得到的反序列化指令序列解析二进制序列,并得到反序列化结果,其中,不同的反序列化指令由不同的反序列化器执行。
36.本实施例中,根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度,具体包括:基于类指令序列排序各注解指令序列,
其中,注解指令序列中的各注解指令至少含有元素名称、长度信息和对象类型定义;基于各注解指令,根据其对象类型定义确定反序列化指令,以及根据其长度信息确定对应于该反序列化指令的二进制数据长度;汇总各反序列化指令,并组成反序列化指令序列。
37.本实施例中,对象类型定义的类别至少包括:整型、浮点数、字符串、填充、复合类型和数组。具体的,不同对象类型定义的注解指令包含的内容如下:
38.a)整型:提供数据长度(即长度信息,以比特计,下同)、字节序信息。
39.b)浮点数:提供数据长度、字节序信息。
40.c)字符串:提供数据长度、字节序信息、编码集信息。
41.d)填充:提供填充部分长度(即长度信息,以比特计,下同)。
42.e)复合类型:通过基础类型组合而成的数据类型定义并具备binarydata注解。
43.f)数组:提供元素个数并且数组的元素应为可反序列化的类型,包括基础类型或通过基础组合而成的复合类型。
44.此外,本技术中,对二进制数据格式的格式定义抽象与对应供程序使用的注解定义binary,格式定义包含如下元素,同时,各元素均可指向二进制数据定义的元素名称从而实现数据的自我指涉:
45.a)元素名称
46.b)比特长度
47.c)字节序
48.d)编码
49.例如,长度信息的内容为比特长度值或元素名称,其中,当长度信息为元素名称时,其比特长度取该元素名称的解析结果。
50.类指令序列还包括长度信息,用于表征其对应的注解指令序列的数量。
51.以下为一个二进制序列的反序列化过程为例:
52.在java程序代码中存在如下一个注解指令序列
[0053][0054][0055]
上述在类添加注解标记@binarydata并在各成员上添加注解标记@binary,表明需要解析。首先根据注解,按照定义的顺序,逐一获取到类成员的类型定义与注解中关于二进制格式的定义:
[0056]
若其长度为非定长,而是引用了先前已经定义的某一个长度。则使用反射调用获取已经解析并获取到的长度信息。
[0057]
基于以上的定义属性,逐一根据属性定义的格式信息对二进制数据进行提取并调用对应的反序列化器,最终完成整个binarydata解析。
[0058]
对应的二进制序列如下:
[0059]
0x00 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40 0x48 0x50 0x58 0x60 0x68 0x70 0x78 ....
[0060]
0000 000a 696d 6167 652f 6a70 6567 0000 0640 0000 0640 0018 0008 0070ffd8 ffe1 ....
[0061]
1)解析mimestringlength,根据成员类型与注解,获取到定义:整形、长度为32比特,字节序为大端序。未定义起始位置,且为第一个元素,所以从0开始,读取到数据0x0000000a,将上述信息提供给整型反序列化器,获得数据10。
[0062]
2)解析mimetype,根据成员类型与注解,获取到定义,字符串、长度为引用值,根据
定义获取到步骤1中的10,无字节序,编码为ascii,未定义固定起始位置,故从上一个元素的结束位置开始,将上述信息提供给字符串反序列化器,获得数据image/jpeg。
[0063]
3)解析picturewidth,根据成员类型与注解,获取到定义:整形、长度为32比特,字节序为大端序。未定义固定起始位置,故从上一个元素的结束位置开始,读取到数据0x00000640,将上述信息提供给整型反序列化器,获得数据1600,并将数据储存在对应变量中。
[0064]
4)解析pictureheight,根据成员类型与注解,获取到定义:整形、长度为32比特,字节序为大端序。未定义固定起始位置,故从上一个元素的结束位置开始,读取到数据0x00000640,将上述信息提供给整型反序列化器,获得数据1600,并将数据储存在对应变量中。
[0065]
5)解析colordepth,根据成员类型与注解,获取到定义:整形、长度为8比特,无字节序。未定义固定起始位置,故从上一个元素的结束位置开始,读取到数据0x0018,将上述信息提供给整型反序列化器,获得数据24,并将数据储存在对应变量中。
[0066]
6)解析picturedatalength,根据成员类型与注解,获取到定义:整形、长度为32比特,字节序为大端序。未定义固定起始位置,故从上一个元素的结束位置开始,读取到数据0x00080070,将上述信息提供给整型反序列化器,获得数据524400,并将数据储存在对应变量中。
[0067]
7)解析picturedata,根据成员类型与注解,获取到定义:比特数组、长度为引用值,根据定义获取到步骤6中的52400,字节序为大端序。未定义固定起始位置,故从上一个元素的结束位置开始,读取到指定长度的数据,并将数据储存在对应变量中。
[0068]
通过嵌套定义,通过自底向上逐层完成二进制数据的解析,最终将整段二进制数据完整解析出来供程序其他方法使用,如基于上文中定义的picture类型定义,案例如下:
[0069]
@binary(length=2)
[0070]
picture[]array;
[0071]
由于上述定义已经能够充分定义其二进制数据格式,当需要根据定义生成二进制数据时,可根据注解,按照定义的顺序,逐一获取到类成员的类型定义与注解中关于二进制格式的定义,并依照各个成员的定义,生成相应的二进制数据并进行拼接,最终获取到目标的二进制数据。
[0072]
上述类数据解析实现方法,通过将类中待解析的成员添加注解标记,根据注解标记获取到类中待解析的部分与其定义,进行解析得到解析结果。
[0073]
本方法通过注解的形式,在二进制反序列化过程中以定义的形式描述二进制数据格式,提升了二进制数据文件的易读性,避免了引入缺陷,降低了项目代码与方法数量,提升了项目的可维护性。
[0074]
上述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存
储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
技术特征:
1.一种基于配置化的二进制数据反序列化方法,其特征在于,包括:读取二进制序列和对应于该二进制序列的注解标记,其中,所述注解标记包括类指令序列和对应于各类指令的注解指令序列;根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度;基于得到的反序列化指令序列解析所述二进制序列,并得到反序列化结果。2.根据权利要求1所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度,具体包括:基于类指令序列排序各注解指令序列,其中,所述注解指令序列中的各注解指令至少含有元素名称、长度信息和对象类型定义;基于各注解指令,根据其对象类型定义确定反序列化指令,以及根据其长度信息确定对应于该反序列化指令的二进制数据长度;汇总各反序列化指令,并组成反序列化指令序列。3.根据权利要求2所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述对象类型定义的类别至少包括:整型、浮点数、字符串、填充和数组。4.根据权利要求3所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述对象类型定义为字符串的注解指令还包括编码集信息。5.根据权利要求3所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述对象类型定义为整型、浮点数和字符串的注解指令还包括字节序信息。6.根据权利要求3所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述对象类型定义的类别还包括复合类型。7.根据权利要求2所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述长度信息的内容为比特长度值或元素名称,其中,当长度信息为元素名称时,其比特长度取该元素名称的解析结果。8.根据权利要求1所述的一种基于配置化的二进制数据反序列化方法,其特征在于,所述类指令序列包括长度信息,用于表征其对应的注解指令序列的数量。9.一种基于配置化的二进制数据反序列化装置,包括存储器、处理器,以及存储于所述存储器中的程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-8中任一所述的方法。10.一种存储介质,其上存储有程序,其特征在于,所述程序被执行时实现如权利要求1-8中任一所述的方法。
技术总结
本发明涉及一种基于配置化的二进制数据反序列化方法、装置及存储介质,其中方法包括:读取二进制序列和对应于该二进制序列的注解标记,其中,注解标记包括类指令序列和对应于各类指令的注解指令序列;根据注解标记生成反序列化指令序列,以及该反序列化指令序列中各反序列化指令对应的二进制数据长度;基于得到的反序列化指令序列解析二进制序列,并得到反序列化结果。与现有技术相比,本发明提升了代码的可重用性,降低了反复开发的成本,同时将数据定义与解析解耦,便于随时替换或新增相关的反序列化器。的反序列化器。的反序列化器。
技术研发人员:吴正
受保护的技术使用者:中银金融科技有限公司
技术研发日:2022.01.29
技术公布日:2022/5/25
转载请注明原文地址:https://tc.8miu.com/read-25259.html