一种Java对象序列化和反序列化的方法、电子设备及介质技术

技术编号:35189087 阅读:14 留言:0更新日期:2022-10-12 18:04
本发明专利技术提出一种Java对象序列化和反序列化的方法,能够在异构环境下工作且可以根据不同传输场景选择不同传输策略,且在将二进制码反序列化为对象时支持合理的数据类型的转换,数据传输和持久化存储效率较快的同时序列化后的数据占用空间较小。通过本发明专利技术,用户可以实现对Java中原生类型、常用基本类型、基本类型数组、基本集合以及类对象的序列化与反序列化,也可以实现合理数据类型的转换。也可以实现合理数据类型的转换。也可以实现合理数据类型的转换。

【技术实现步骤摘要】
一种Java对象序列化和反序列化的方法、电子设备及介质


[0001]本专利技术涉及数据处理
,具体为一种将Java对象序列化为二进制码和将二进制码反序列化为Java对象的方法、电子设备及介质。

技术介绍

[0002]序列化是指堆内存中的Java对象数据,通过某种方式把对象存储到磁盘文件中,或者传递给其他网络节点的过程,通常是将数据结构或者对象转换成二进制的过程。反序列化指把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成Java对象的过程,即将在序列化过程中生成的二进制串转换成数据结构或者对象的过程。当两个进程在进行远程通信时,彼此可以发送各种类型的数据,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。因此,对Java对象的序列化和反序列化在需要频繁进行数据交换和存储的大数据、电子通信等领域具有广阔的应用前景。
[0003]在大数据分析领域中,对象的序列化和反序列化是一项基本操作,是分布式计算节点与潜在非统一执行环境之间高效通信的一个基本特性。序列化反序列化操作广泛应用于大数据分析框架中,用于远程过程调用和洗牌等海量数据传输。当今大数据分析框架中的海量数据操作,例如map/reduce,shufflfle大量使用序列化反序列化操作。在大型web应用中,为解决这些应用中的可能出现的间歇性故障,其应用程序中的数据序列化是一个重要的环节,序列化和反序列化几乎是工程师们每天都要面对的事情,恰当的序列化协议不仅可以提高系统的通用性、强健性、安全性、优化系统性能,而且会让系统易于调试、便于扩展。电子通信领域,序列化技术一直是数据交换的重要组成部分。由于电子通信需要进行频繁的数据传输,在数据传输时发送方需要将对象序列化为二进制码,接收方需要将二进制码反序列化为对象,因此,提高序列化反序列化的速度便能大幅提高数据传输的效率。
[0004]目前针对Java对象的序列化和反序列化方法灵活性较差,缺乏与对应场景相对应的序列化流发送策略,数据传输和处理的效率低。

技术实现思路

[0005]针对现有技术存在的问题,本专利技术提出一种Java对象序列化和反序列化的方法、电子设备及介质,能够在异构环境下适应多种传输情况,包括对Java中原生类型(boolean、short、int等)、常用基本类型(String、Date、BigInteger等)、基本类型数组(boolean[]、short[]、int[]等)、基本集合以及类对象的序列化与反序列化。
[0006]本专利技术的技术方案为:
[0007]所述一种Java对象序列化和反序列化的方法,序列化包括以下步骤:
[0008]步骤1:初始化用于存储序列化中的枚举类型和类对象结构的对象schema和字节数组封装类的对象dataBuffer;对象dataBuffer中的字节数组buffer用于存储本次序列化的结果;
[0009]步骤2:生成序列化数据
[0010]首先对需要序列化的对象进行检查,检查是否是AsType,如果是AsType,则将值转化为AsType对应的类型;所述AsType是为了传输优化而定义的一套接口,能够实现将一种数据类型当成其他一种数据类型来处理;
[0011]然后根据需要序列化的对象类型分别采取不同的序列化策略进行序列化,得到序列化结果数组buffer;对象类型为:直接转换类型,基本集合、文件或枚举类型,类对象;
[0012]步骤3:利用得到的序列化结果数组buffer生成结果数据;
[0013]反序列化包括以下步骤:
[0014]步骤4:在序列化的最终结果数组中按顺序读出schema的内容所占的字节长度、序列化结果总字节长度、schema的内容和序列化结果;
[0015]步骤5:根据需要反序列化的数据类型采取不同的反序列化策略,实现反序列化的过程。
[0016]进一步的,步骤1中,对象schema分为存储枚举类型结构的EnumSchema和存储类对象结构的ObjectSchema两种类型。
[0017]进一步的,步骤2中,所述直接转换类型包括Java的原生类型、Java的常用基本类型以及Java的基本类型数组;如果对象类型是直接转换类型,先将该对象的类型编码存储到dataBuffer中的字节数组buffer中,再对该对象进行序列化,并将序列化后的结果存入字节数组中。
[0018]进一步的,步骤2中,所述基本集合、文件或枚举类型包括链表List类型、数组Array类型、Map类型、集合Set类型、文件File类型或枚举Enum类型;
[0019]如果该对象类型为链表类型、数组类型、Map类型或集合类型,先在字节数组buffer中存储当前对象类型对应的字节编码,再存储该对象的元素个数,最后遍历该对象中的每个元素,对该对象中的每一个元素进行序列化;
[0020]如果该对象类型为文件类型,先在字节数组buffer中存储当前对象类型对应的字节编码,接着在字节数组buffer中存储文件名称长度和序列化后的文件名称,最后存储文件内容所占的字节长度和序列化后的文件内容;
[0021]如果该对象类型为枚举类型,先判断该枚举类型对应的enumSchema是否已经存在,若不存在,则将该枚举类型的名称及对应的enumSchema以键:值的形式存入哈希表schemas中,其中enumSchema存储枚举类型定义中的每一个名称和该名称在定义中的顺序号;若该枚举类型对应的enumSchema已存在,则首先在字节数组buffer中存储枚举类型对应的字节编码,接着存储该枚举类型对应的enumSchema在哈希表schemas中的顺序号,最后存储该枚举变量的取值在枚举类型定义中对应的顺序号。
[0022]进一步的,步骤2中,在对类对象进行序列化时,首先判断该类对应的objectSchema是否已经存在,若不存在,则将该类对象对应的类名及对应的objectSchema以键:值的形式存入哈希表schemas中,其中objectSchema存储该类的所有可用属性的名称和该属性的顺序号;若该类对应的objectSchema已存在,则:
[0023]先新建一个字节数组objectContent;
[0024]遍历该类中的所有可用属性,对于每一个属性,首先在字节数组objectContent中存储该属性在类中的顺序号,再对每一个属性进行序列化;遍历结束后,整个类的所有属性
完成序列化,并将结果存储到字节数组objectContent;
[0025]在字节数组buffer中,首先存储类对象的类型编码,接着存储该类对应的objectSchema在哈希表schemas中的顺序号,再存储字节数组objectContent的大小,最后存储整个字节数组objectContent的内容,整个类对象的序列化过程结束。
[0026]进一步的,步骤3中,生成整个序列化过本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种Java对象序列化和反序列化的方法,其特征在于:序列化包括以下步骤:步骤1:初始化用于存储序列化中的枚举类型和类对象结构的对象schema和字节数组封装类的对象dataBuffer;对象dataBuffer中的字节数组buffer用于存储本次序列化的结果;步骤2:生成序列化数据首先对需要序列化的对象进行检查,检查是否是AsType,如果是AsType,则将值转化为AsType对应的类型;所述AsType是为了传输优化而定义的一套接口,能够实现将一种数据类型当成其他一种数据类型来处理;然后根据需要序列化的对象类型分别采取不同的序列化策略进行序列化,得到序列化结果数组buffer;对象类型为:直接转换类型,基本集合、文件或枚举类型,类对象;步骤3:利用得到的序列化结果数组buffer生成结果数据;反序列化包括以下步骤:步骤4:在序列化的最终结果数组中按顺序读出schema的内容所占的字节长度、序列化结果总字节长度、schema的内容和序列化结果;步骤5:根据需要反序列化的数据类型采取不同的反序列化策略,实现反序列化的过程。2.根据权利要求1所述一种Java对象序列化和反序列化的方法,其特征在于:步骤1中,对象schema分为存储枚举类型结构的EnumSchema和存储类对象结构的ObjectSchema两种类型。3.根据权利要求1所述一种Java对象序列化和反序列化的方法,其特征在于:步骤2中,所述直接转换类型包括Java的原生类型、Java的常用基本类型以及Java的基本类型数组;如果对象类型是直接转换类型,先将该对象的类型编码存储到dataBuffer中的字节数组buffer中,再对该对象进行序列化,并将序列化后的结果存入字节数组中。4.根据权利要求2所述一种Java对象序列化和反序列化的方法,其特征在于:步骤2中,所述基本集合、文件或枚举类型包括链表List类型、数组Array类型、Map类型、集合Set类型、文件File类型或枚举Enum类型;如果该对象类型为链表类型、数组类型、Map类型或集合类型,先在字节数组buffer中存储当前对象类型对应的字节编码,再存储该对象的元素个数,最后遍历该对象中的每个元素,对该对象中的每一个元素进行序列化;如果该对象类型为文件类型,先在字节数组buffer中存储当前对象类型对应的字节编码,接着在字节数组buffer中存储文件名称长度和序列化后的文件名称,最后存储文件内容所占的字节长度和序列化后的文件内容;如果该对象类型为枚举类型,先判断该枚举类型对应的enumSchema是否已经存在,若不存在,则将该枚举类型的名称及对应的enumSchema以键:值的形式存入哈希表schemas中,其中enumSchema存储枚举类型定义中的每一个名称和该名称在定义中的顺序号;若该枚举类型对应的enumSchema已存在,则首先在字节数组buffer中存储枚举类型对应的字节编码,接着存储该枚举类型对应的enumSchema在哈希表schemas中的顺序号,最后存储该枚举变量的取值在枚举类型定义中对应的顺序号。
5.根据权利要求2所述一种Java对象序列化和反序列化的方法,其特征在于:步骤2中,在对类对象进行序列化时,首先判断该类对应的objectSchema是否已经存在,若不存在,则将该类对象对应的类名及对应的objectSchema以键:值的形式存入哈希表schemas中,其中objectSchema存储该类的所有可用属性的名称和该属性的顺序号;若该类对应的objectSchema已存在,则:先新建一个字节数组objectContent;遍历该类中的所有可用属性,对于每一个属性,首先在字节数组objectContent中存储该属性在类中的顺序号,再对每一个属性进行序列化;遍历结束后,整个类的所有属性完成序列化,并将结果存储到字节数组objectContent;在字节数组buffer中,首先存储类对象的类型编码,接着存储该类对应的objectSchema在哈希表schemas中的顺序号,再存储字节数组objectContent的大小,最后存储整个字节数组objectContent的内容,整个类对象的序列化过程结束。6.根据权利要求1所述一种Java对象序列化和...

【专利技术属性】
技术研发人员:刘航马春燕常征
申请(专利权)人:西北工业大学
类型:发明
国别省市:

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

1