序列化方法、反序列化方法、序列化装置及反序列化装置与流程

文档序号:11828763阅读:192来源:国知局
序列化方法、反序列化方法、序列化装置及反序列化装置与流程

本申请涉及内存读写技术领域,尤其是在内存中进行的序列化方法、反序列化方法、序列化装置及反序列化装置。



背景技术:

Java虚拟机内存,简称内存,即Java虚拟机运行时存储数据的区域。Java虚拟机在工作时,首先从虚拟机内存中查找数据,当未查找到时,则从硬盘读取数据,并将读取到的数据存储到虚拟机内存中。

内存存储数据的一种结构是堆,将数据存储在堆内,会提高数据读写效率,但同时会增加内存垃圾数据回收量,这反而也会影响到数据处理效率。因此,为了减轻堆内存储对内存垃圾回收的影响,选择将数据存储在堆外。在这种存储方式下,Java虚拟机将从硬盘读取到的数据存储到内存的过程是,首先将所需数据读取至堆内内存中,再将其存储到堆外内存中。

当上述所需数据为对象这种类型的数据时,将堆内内存中的对象存储到堆外内存的过程中涉及到对象的序列化。序列化,是将对象转化为字节流放入到序列的过程。对应地,从堆外内存中读取序列,并利用序列中的字节流生成对象过程为反序列化。



技术实现要素:

本申请提供了一种序列化方法,用以将堆内存中的对象写入到堆外内存中,相对应地,还提供了一种反序列化方法,用以从堆内存的序列中读取对象。本申请还提供了序列化装置及反序列化装置,分别用以保证上述序列化方法及反序列化方法在实际中的实现及应用。

为实现所述目的,本申请提供的技术方案如下:

一种序列化方法,包括:

确定目标对象的存储结构类型;

在序列器池中,获取与所述目标对象的存储结构类型对应的目标序列器;其中,所述目标序列器中保存有所述目标对象的元数据,所述元数据用于表示所述目标对象的存储内容类型;

触发所述目标序列器将所述目标对象写入所述序列。

可选地,上述的序列化方法中,所述目标对象的存储结构类型为非数组,所述目标对象为非数组对象,所述目标序列器为非数组对象序列器;

相应地,所述触发所述目标序列器将所述目标对象写入所述序列,包括触发所述非数组对象序列器执行以下步骤:

在堆内存中,获取所述非数组对象的若干个基本类型字段;

按照预先确定的字节切分长度,切分所述若干个基本类型字段,获得若干个数据项;其中,所述字节切分长度为大于1的值;

将所述若干个数据项写入所述序列。

可选地,上述的序列化方法中,所述非数组对象的堆内存区域划分为首部与身体部分,所述身体部分包含所述基本类型字段;

其中,所述字节切分长度的确定步骤,具体为:

获取所述非数组对象的字节长度、所述首部的字节长度及所述身体部分的字节长度;其中,所述非数组对象的字节长度为第一数值的整数倍,所述第一数值为合数,所述首部的字节长度为所述第一数值的因数的整数倍;

将所述因数确定为字节切分长度。

可选地,上述的序列化方法还包括:

当所述非数组对象中存储有引用类型字段时,将所述引用类型字段指向的对象写入所述序列器。

可选地,上述的序列化方法中,所述目标对象的存储结构类型为基本类型数组,所述目标对象为基本类型数组对象,所述目标序列器为基本类型数组对象序列器;

相应地,所述触发所述目标序列器将所述目标对象写入所述序列,包括:触发所述基本类型数组对象序列器执行以下步骤:

获取所述基本类型数组对象的全部数组元素;其中,所述数组元素的类型为基本类型;

将所述全部数组元素写入所述序列。

可选地,上述的序列化方法还包括:

在未获取到目标序列器的情况下,生成与所述目标对象对应的目标序列器类;

对所述目标序列器类进行实例化,以获得目标序列器。

可选地,上述的序列化方法中,所述目标对象对应的类为非数组对象类,所述非数组对象类包含若干个字段;

相应地,所述生成与所述目标对象对应的目标序列器类,包括:

依据预设切分规则,在所述若干个字段的堆内存中确定若干个切分点;

针对每个所述切分点,生成各自对应的堆内存序列写入方法,以获得所述非数组对象的目标序列器类;其中,所述堆内存序列写入方法用于将所述非数组对象在堆内存中存储的字段写入序列中。

本申请还提供了一种反序列化方法,包括:

在序列中,获取序列器的索引;其中,所述序列中包括序列器的索引及对象字节流;

在序列器池中,获取与所述序列器的索引对应的目标序列器;

获取所述目标序列器中存储的元数据;

触发所述目标序列器依据所述元数据,将所述序列中的对象字节流生成目标对象。

本申请还提供了一种序列化装置,包括:

对象类型确定模块,用于确定目标对象的存储结构类型;

序列器获取模块,用于在序列器池中,获取与所述目标对象的存储结构类型对应的目标序列器;其中,所述目标序列器中保存有所述目标对象的元数据,所述元数据用于表示所述目标对象的存储内容类型;

序列器序列化模块,用于触发所述目标序列器将所述目标对象写入所述序列。

本申请还提供了一种反序列化装置,包括:

序列器索引获取模块,用于在序列中,获取序列器的索引;其中,所述序列中包括序列器的索引及对象字节流;

序列器获取模块,用于在序列器池中,获取与所述序列器的索引对应的目标序列器;

元数据获取模块,用于获取所述目标序列器中存储的元数据;

序列器反序列化模块,用于触发所述目标序列器依据所述元数据,将所述序列中的对象字节流生成目标对象。

由以上的技术方案可知,本申请提供的序列化方法,首先确定目标对象的存储结构类型,利用该存储结构类型,查找对应的目标序列器,目标序列器中保存有目标对象的元数据信息,进而触发目标序列器将目标对象写入到序列中,从而完成目标对象序列化过程。

当然,实施本申请的任一产品并不一定需要同时达到以上所述的所有优点。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请提供的序列化及反序列化关系的示意图;

图2为本申请提供的序列化方法一个实施例的流程图;

图3为本申请提供的非数组对象序列器对非数组对象执行序列化的流程图;

图4A为本申请提供的非数组对象的内存结构的一个示例图;

图4B为本申请提供的对图4A所示的非数组对象的基本类型字段的切分示例图;

图5为本申请提供的基本类型数组对象序列器对基本类型数组对象执行序列化的流程图;

图6为本申请提供的序列化方法另一实施例的流程图;

图7为本申请提供的非数组对象的内存结构另一示例图;

图8为本申请提供的反序列化方法实施例的流程图;

图9为本申请提供的序列化装置的结构示意图;

图10为本申请提供的反序列化装置的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

发明人发现,在包含多个子系统的系统架构中,子系统之间会进行数据交互,如第一子系统向第二子系统请求数据。为了提高响应速度,被请求的子系统可以选择将数据存储在子系统本地,具体是子系统的堆内存中,这种存储方式可以被称为本地缓存。但是,如果堆内存中的数据过多,会影响内存垃圾回收,所以被请求的子系统最终将数据存储在堆外内存中。这样的存储方式,对被请求子系统而言,既可以提高数据的响应速度,又可以避免对内存垃圾回收的影响,进而可提高整个系统的工作性能。当然,上述多个子系统的场景仅仅是一种示例,本发明应用但并不局限于该种场景中,单系统的场景也可适用。例如,一个单系统网站,可以把网页数据存储在堆外,当网站服务器接收到用户访问网页的请求时,从本地缓存中取出网页数据,填充在网页模板中后返回给用户。另外,除了这些web场景,其它非web系统也同样适用。

在多个子系统的应用场景中,以第三方支付系统为例,其包含的子系统有订单子系统及优惠子系统,其中,订单子系统用于为买方用户生成商品订单,优惠子系统中存储有卖方用户设置的商品价格的优惠数据。买方用户选择商品提交订单后,订单子系统在商品价格存在优惠的情况下,会向优惠子系统发送数据请求,以获取优惠子系统中的优惠数据,从而利用优惠数据生成价格准确的商品订单。

优惠子系统接收到该请求后,会首先在堆内中查找优惠数据,若查找到,则直接将优惠数据返回至订单子系统,若未查找到,则从硬盘中读取优惠数据至堆内存中,然后将其返回至订单子系统。需要说明的是,订单子系统还可能再次请求该优惠数据,因此,在保证优惠数据的高效读取的基础上,同时避免降低垃圾回收效率,优惠子系统将堆内存的优惠数据保存至堆外内存中。当该优惠数据再次被请求时,优惠子系统直接从堆外内存中进行读取,并将优惠数据返回至订单子系统。

具体地,优惠数据的结构形式可以为对象。对象具有属性和方法,其中,属性表示对象的内容特征,用字段表示;方法表示有关对象的操作,用函数表示。例如,优惠数据“A”的属性包含优惠值“5”,以表示优惠的内容;优惠数据“A”的方法包含利用优惠值“5”计算优惠后价格的方法。将对象数据存储至堆外内存,需要将其序列化为字节流,并将字节流保存至堆外内存。对应地,读取堆外保存的字节流为反序列化的过程,即将字节流重新生成对象。

为此,本申请提供了一种序列化方法,参见图1所示的序列化与反序列关系示意图,如图1所示,序列化是将堆内存中的对象以字节流的形式存储到堆外内存中。参见图2,其示出了本申请提供的序列化方法实施例的流程,具体包括以下步骤:

步骤S201:确定目标对象的存储结构类型。

本实施例中,目标对象存储在堆内,具体地,在堆内以某种类型的存储结构进行存储。从堆内存中获取到目标对象后,首先确定目标对象的存储结构类型。其中,存储结构类型指的是对象的具体数据结构,包括数组结构与非数组结构,更进一步,数组结构还可以根据数据类型进行划分,划分为基本类型数组与引用数组。其中,数据类型中的基本类型包括整型、浮点型及字符型等类型。

步骤S202:在序列器池中,获取与所述目标对象的存储结构类型对应的目标序列器;其中,所述目标序列器中保存有所述目标对象的元数据,所述元数据用于表示所述目标对象的存储内容类型。

其中,序列器池中保存有多个序列器,序列器分为多个类型,分类标准可以是对象的存储结构类型。根据上述对存储结构类型的说明,序列器池中的序列器可以划分为数组对象序列器及非数组对象序列器,其中,数组对象序列器还可以进一步划分为基本类型数组序列器及引用数组序列器。

在步骤S201确定出目标对象的存储结构类型后,利用该存储结构类型,可以在序列器池中,查找到该目标对象对应的序列器,即本步骤中的目标序列器。需要说明的是,目标序列器中存储有目标对象的元数据,元数据表示目标对象的存储内容类型。

具体来讲,元数据表示目标对象包含哪些内容,如上所述,对象包含字段及函数,因此,元数据记录目标对象的字段标识、字段的数据类型、函数标识、函数输入参数及输出参数等基本信息。当然,元数据记录的可以是目标对象包含内容的其他方面信息,并不限定于此。

需要说明的是,元数据的作用体现在反序列化的过程中。因为,序列化的过程是将对象转化为字节流,然而,根据上述对应用场景的描述中可知,当第一子系统向第二子系统请求对象数据时,第二子系统需要将序列化后的字节流还原为对象,进而将对象返回给第一子系统。而在还原过程中,需要利用到元数据记录的对象存储内容信息。其中,关于反序列化的过程此处并不详述,参见下文内容。需要指出的是,由于元数据保存在目标序列器中,为了能在反序列化时,查找到元数据,可以将目标序列器的标识写入序列中。该标识可以是目标序列器在序列器池中的索引。

步骤S203:触发所述目标序列器将所述目标对象写入所述序列。

其中,在上一步骤获取到目标序列器后,触发目标序列器将目标对象转化为字节流,并将字节流写入到序列中。序列保存在堆外,将字节流写入到序列,即完成了将对象存储在堆外的目的。

由以上的技术方案可知,本实施例首先确定目标对象的存储结构类型,利用该存储结构类型,查找对应的目标序列器,目标序列器中保存有目标对象的元数据信息,进而触发目标序列器将目标对象写入到序列中,从而完成目标对象序列化过程。

需要说明的是,上述的序列化实施例中,可以将目标序列器的索引写入到序列中,序列器索引为字节长度较小的类型,如4字节的整型,这样,序列化的数据写入量及反序列化时的数据读取量均较小,分别提高序列化及反序列化的效率。

在实际应用中,目标对象的存储结构类型不同,目标序列器将目标对象写入序列的方式也存在不同。基于此,下面分别说明非数组对象、基本类型数组两种不同类型存储结构对象的序列化过程。

目标对象的存储结构类型为非数组,对应地,这种目标对象被称为非数组对象,其对应的目标序列器被称为非数组对象序列器。在这种情况下,参 见图3所示的非数组对象序列器对非数组对象执行序列化的流程,上述实施例中的步骤S203触发所述目标序列器将所述目标对象写入所述序列的具体实现方式是:触发非数组对象序列器执行如图3所示的步骤A1~步骤A3:

步骤A1:在堆内存中,获取所述非数组对象的若干个基本类型字段。

其中,非数组对象存储在堆内存中,且非数组对象包含多个字段,字段的类型为如整形、浮点型或字符型等的基本数据类型。进而,可以理解的是,基本类型字段是存储在堆内存中的。在堆内存中,获取非数组对象的全部基本类型的字段。

具体地,非数组对象在堆内存中具有特定格式的内存结构,内存结构可以具体包括首部与身体部分。其中,首部存储控制信息,并不属于本申请涉及的内容,本申请涉及的是身体部分,身体部分包含有非数组对象的基本类型字段。例如,非数组对象A包含三个字段,分别为四字节整型的字段f1、一字节整型的字段f2及八字节整型的字段f3,该非数组对象A的内存结构如图4A所示,如图4A所示,非数组对象A的身体部分包含有三个基本类型的字段,分别为字段f1、字段f2及字段f3。

步骤A2:按照预先确定的字节切分长度,切分所述若干个基本类型字段,获得若干个数据项;其中,所述字节切分长度为大于1的值。

在目标对象的存储结构类型为非数组的情况下,需要预先确定字节切分长度,字节切分长度表示每个切分单位的字节长度。按照所述字节切分长度,对上述步骤获得的若干个基本类型字段进行切分,从而获得若干个数据项。可以理解的是,数据项的字节长度也就是字节切分长度。参见图4B,其示出了对非数组对象A的基本类型字段的切分情况。如图4B所示,虚线表示切分点,除最后一个数据项之外,每两条虚线之间的单元为数据项,可见,非数组对象A的基本类型字段切分后,获得5个数据项。

需要说明的是,确定出的字节切分长度大于1,也即数据项的字节长度大于1。优选地,确定字节切分长度的步骤具体为:

获取所述非数组对象的字节长度、所述首部的字节长度及所述身体部分的字节长度;其中,所述非数组对象的字节长度为第一数值的整数倍,所述第一数值为合数,所述首部的字节长度为所述第一数值的因数的整数倍;将所述因数确定为字节切分长度。

其中,通过对非数组对象的上述特定格式的内存结构分析得出,非数组对象的字节长度为某个数值的整数倍,为了便于描述,该某个数值称为第一数值。需要说明的是,系统为了保证实现所述特征,在对象的字节长度不足以达到某个数值的整数倍时,会在身体部分添加填充,如图4A中的“填充”,填充的是若干个字节,其并不存储实际数据,仅仅为了增大对象字节长度的目的。第一数值为合数,非数组对象首部的字节长度为第一数值的因数的整数倍,则可将该因数确定为字节切分长度。

例如,非数组对象A的字节长度为8的整数倍,非数组对象A的首部的字节长度为12。在该示例中,第一数值为8,第一数值8的因数包括1、2、4及8,首部字节长度12为因数1、因数2或因数4的整数倍,但由于字节切分长度大于1,因此,可将因数2或者因数4确定为字节切分长度。优选地,将因数4确定为字节切分长度。理由是,相较于字节切分长度2而言,字节切分长度4的字节数更多,也即数据项的字节数也更多,序列化的写入效率更高。

需要补充的是,非数组对象不仅字节长度为第一数值的整数倍,其在内存中的起始地址也为第一数值的整数倍。基于该种特定格式的内存结构,将第一数值的某个因数(即“非数组对象首部字节长度为第一数值的因数的整数倍”中的因数)确定为字节切分长度,可以避免访问切分后的单元出现的硬件异常问题。具体理由如下:

在上述内存结构的系统中,系统访问切分后的数据是以第一数值为单位进行访问的,若以其他数值的字节长度切分字段,切分为的单元长度无法被第一数值整除,会导致访问时的硬件异常。然而,在本步骤的优选实现方式中,将第一数值的某些因数作为字节切分长度,切分后的每个单元(即本步骤中的数据项)必然能被系统完整地访问,从而避免访问时的硬件异常。

步骤A3:将所述若干个数据项写入所述序列。

其中,将步骤A2获得的数据项依次写入序列中。需要说明的是,数据项的字节长度大于1,这样,相较于每次写入一个字节的方式而言,提高单次写入的数据量,从而降低写入操作的次数,进而提高序列化的效率。

由以上的技术方案可知,对于非数组类型的目标对象,目标序列器执行的序列化步骤为,按照预设确定的字节切分长度,切分非数组对象的基本类 型字段,从而获得若干个数据项,进而将这若干个数据项写入序列。需要说明的是,该字节切分长度为大于1的数值,也即切分出的数据项的字节数大于1,将字节数大于1的数据项写入序列,相较于逐个单字节的写入方式,写入效率更高。另外,字节切分长度是根据非数组对象的物理存储结构来确定的,基于特定格式的物理存储结构确定的字节切分长度,可以在提高写入效率的基础上,同时避免被系统访问时的硬件异常问题。

需要补充的是,若非数组对象的字段中除了包含基本类型字段外,还包括引用类型字段,则需要将引用类型字段指向的对象写入到序列中。具体来讲,引用类型字段即指针字段,指针字段指向的是目标对象之外的其他对象,进而,需要将其他对象的基本类型字段写入到序列中。写入方法可以根据其他对象的存储结构类型选择本说明书中对应的写入方法,此处并不赘述。

上面介绍了非数组对象的序列化过程,下面对基本类型数组的序列化过程进行说明。

目标对象的存储结构类型为基本类型数组,对应地,这种目标对象被称为基本类型数组对象,且其对应的目标序列器为基本类型数组对象序列器。在这种情况下,参见图5所示的基本类型数组对象序列器对基本类型数组对象执行序列化的流程,上述实施例中的步骤S203触发所述目标序列器将所述目标对象写入所述序列的具体实现方式是:触发基本类型数组对象序列器执行如图5所示的步骤B1~步骤B2:

步骤B1:获取所述基本类型数组对象的全部数组元素;其中,所述数组元素的类型为基本类型。

其中,基本类型数组对象指的是数组类型的对象,数组中包含若干个数组元素,且每个数组元素的数据类型为基本类型,基本类型包括整型、浮点型及字符型等。例如,数组B包含5个数组元素,5个数组元素的数据类型为四字节整型。需要说明的是,本步骤是一次性读取全部的数组元素。

步骤B2:将所述全部数组元素写入所述序列。

其中,将步骤B1读取的全部数组元素全部写入到序列中。

由以上的技术方案可知,对于基本类型数组对象,基本类型数组对象序列器一次性读取该数组对象中的全部数组元素,并将读取到的数组元素一次 性写入至序列中,相较于每次读取数组中的一个数据元素,并将该一个数组元素写入序列的方式而言,避免多次循环读取带来的系统开销,进而提高序列化效率。

参照图6,其示出了本申请提供的序列化方法另一实施例的流程。如图6所示,本实施例的流程在图2示出的步骤S203之后,还可以包括:步骤S601及步骤S602;其中:

步骤S601:在未获取到目标序列器的情况下,生成与所述目标对象对应的目标序列器类。

其中,在步骤S202未获取到目标序列器的情况下,利用目标对象对应的类(即实例化目标对象的类),生成目标对象对应的序列器类,该序列器类称为目标序列器类。在目标对象为非数组对象的情况下,非数组对象对应的类为非数组对象类,基于此,目标序列器类的具体生成过程包括下述步骤C1~步骤C2:

步骤C1:依据预设切分规则,在所述若干个字段的堆内存中确定若干个切分点。

其中,非数组对象类包含若干个字段,如图4A所示的堆内存中的非数组对象,该非数组对象对应的类的字段结构也图4A所示,非数组对象类包含三个字段。依据预先设置的切分规则,在若干个字段的堆内存中确定若干个切分点,切分点如图4B所示的虚线。

切分点可以用偏移量表示,偏移量指的是字段距离对象的内存起始地址的长度,以字节为单位。如图4B所示的几个切分点,在图4B中,对象的首部字节长度为12,若以4为字节切分长度进行切分,则各个切分点的偏移量分别是12、16、20、24及28。各个偏移量可以存储在数组中,从而获得偏移量数组,偏移量数组可以存储在生成的目标序列器中。在生成目标索引器类时,需要读取偏移量数组中的各个偏移量,进而利用读取的偏移量执行下一步骤。

步骤C2:针对每个所述切分点,生成各自对应的堆内存序列写入方法,以获得所述非数组对象的目标序列器类;其中,所述堆内存序列写入方法用于将所述非数组对象在堆内存中存储的字段写入序列中。

其中,切分点表示在何处对非数组对象的堆内存中存储的字段进行切分,当然,切分后的字段需要写入到序列中,写入过程需要利用堆内存序列写入方法,堆内存序列写入方法用于将非数组对象在堆内存中存储的字段写入序列中。需要说明的是,在所述字段包含基本类型字段的情况下,为基本类型字段的每个切分点生成各自对应的基本序列写入方法;在所述字段包含引用类型字段的情况下,为引用类型字段的每个切入点生成各自对应的引用序列写入方法。具体来讲,本步骤是为每个数据项生成写入序列的代码;在包含引用的情况下,为每个引用字段生成读取引用对象的代码,并生成将引用对象写入序列的代码。

步骤S602:对所述目标序列器类进行实例化,以获得目标序列器。

需要说明的是,序列器也可以看作是对象,对象是由类实例化后获得的。因此,在获得目标序列器类后,需要对该目标序列器类进行实例化后,从而获得目标对象对应的目标序列器。

需要说明的是,有关本实施例的步骤S201至步骤S203的说明,请参见第一个实施例,此处并不赘述。

本实施例中的目标序列器是在编译过程中生成的,编译过程指的是将利用高级语言编写的源程序生成计算机能识别的二进制目标程序的过程,在本实施例中,编译指的是将序列化方法的源程序生成二进制目标程序的过程,进而,可以理解的是,目标序列器类是在将序列化方法的源程序生成目标程序的过程中生成的。

当然,目标序列器类可以是预先编写在源程序中的,但是,这种方式编写的目标序列器称为通用序列器,通用序列器是对目标对象对应的类通用的,也就是说,目标对象对应的类实例化的所有对象都可以使用该通用序列器,利用编译生成的目标序列器称为专用序列器,专用序列器不是针对类的,只是针对目标对象的,其可以表示目标对象存储的数据特征,具体指的是可以表示切分目标对象字段的偏移量。这样,相较于通用序列器,专门序列器在序列化切分目标对象的字段时,可以避免读取偏移量的开销,从而提高序列化效率。

下面结合通用序列器及专用序列器的序列化方法的代码,对专用序列器的上述优势进行详细说明。

例如,目标对象为非数组对象,其对应的类为类C,类C的具体结构为:

从类C的结构中可以得出,类C实例化后的目标对象同样包含4个字段,分别为字段f1、字段f2、字段f3及字段f4,目标对象的内存结构如图7所示。确定对该目标对象的字段的切分点,例如,确定出的切分点的偏移量分别为12、16、20、24及28。其中,由于整型字段f1及单精度浮点型字段f3属于基本类型字段,则可获得三个数据项,偏移量分别为12、20及28。同时,包含两个引用字段,偏移量分别为16及24。各个偏移量保存到偏移量数组或偏移量列表中。例如,将基本类型字段的偏移量保存到数据项偏移量列表中,将引用字段的偏移量保存到引用字段偏移量列表中。

针对基本类型字段,通用序列器的序列化代码如下:

对应地,针对基本类型字段,专用序列器的序列化代码如下:

针对引用字段,通用序列器的序列化代码如下:

对应地,针对引用字段,专用序列器的序列化代码如下:

通过代码对比可见,生成的专用序列器,将数据项的偏移量如12、20及28写入在代码中,同时将引用字段的偏移量如16及24也写入在代码中,从而在序列化过程时,专用序列器并不需要如通用序列器一样,遍历偏移量列表以读取各个偏移量,从而节省了循环遍历的开销(读取偏移量的开销、循环迭代器的自增开销、循环结束条件的判断及跳转开销等),进而提高序列化的效率。

对应上述第一个实施例中的序列化方法,本申请还提供了反序列化方法,如图8所示的反序列化方法实施例的流程,具体包括以下步骤:

步骤S801:在序列中,获取序列器的索引;其中,所述序列中包括序列器的索引及对象字节流。

其中,序列化时可以将序列器的索引写入到序列中,反序列化时,首先在序列中读取序列器的索引。

步骤S802:在序列器池中,获取与所述序列器的索引对应的目标序列器。

其中,利用步骤S801读取到的序列器索引,在序列器池中查找序列器,查找到的序列器称为目标序列器。

步骤S803:获取所述目标序列器中存储的元数据。其中,目标序列器中保存有元数据,元数据表示的是目标对象的存储内容类型。

步骤S804:触发所述目标序列器依据所述元数据,将所述序列中的对象字节流生成目标对象。

其中,触发目标序列器执行序列化步骤,即将序列中的对象的字节流读取出来,并利用对象字节流生成对象,生成的对象称为目标对象。

需要说明的是,反序列化是与序列化相反的过程,有关反序列的说明可参照上文提供的序列化方法,此处并不赘述。反序列化时,读取的字节流大小同样依照上文提供的字节切分长度,读取的方式也依据目标对象的不同而选择不同的目标序列器,以提高反序列化的效率。

下面对本申请提供的序列化装置进行介绍,需要说明的是,下文有关序列化装置的工作过程可以参照上文提供的序列化方法,以下并不做赘述。

对应上述本申请提供的序列化方法的第一个实施例,本申请提供了一种序列化装置,参照图9,其示出了序列化装置的具体结构,该装置具体包括:对象类型确定模块901、序列器获取模块902及序列器序列化模块903;其中:

对象类型确定模块901,用于确定目标对象的存储结构类型;

序列器获取模块902,用于在序列器池中,获取与所述目标对象的存储结构类型对应的目标序列器;其中,所述目标序列器中保存有所述目标对象的元数据,所述元数据用于表示所述目标对象的存储内容类型;

序列器序列化模块903,用于触发所述目标序列器将所述目标对象写入所述序列。

由以上的技术方案可知,本实施例中的对象类型确定模块901确定目标对象的存储结构类型,序列器获取模块902利用该存储结构类型,查找对应的目标序列器,目标序列器中保存有目标对象的元数据信息,进而序列器序列化模块903触发目标序列器将目标对象写入到序列中,从而完成目标对象序列化过程。需要说明的是,本实施例中,读取的序列器索引为字节长度较小的类型,如4字节的整型,这样,反序列化过程中数据读取量较小,从而提高反序 列化的效率。

可选地,目标对象的存储结构类型为非数组,目标对象为非数组对象,目标序列器为非数组对象序列器;对应地,序列器序列化模块903的具体结构包括:字段获取子模块、字段切分子模块及数据项写入子模块;其中:

字段获取子模块,用于触发所述非数组对象序列器在堆内存中,获取所述非数组对象的若干个基本类型字段;

字段切分子模块,用于触发所述非数组对象序列器按照预先确定的字节切分长度,切分所述若干个基本类型字段,获得若干个数据项;其中,所述字节切分长度为大于1的值;

数据项写入子模块,用于触发所述非数组对象序列器将所述若干个数据项写入所述序列。

可选地,非数组对象的堆内存区域划分为首部与身体部分,身体部分包含所述基本类型字段;对应地,上述序列化装置中包括:切分长度确定模块,用于确定字节切分长度。其中:切分长度确定模块可以具体包括:字节长度获取子模块及字节长度确定子模块;其中:

字节长度获取子模块,用于获取所述非数组对象的字节长度、所述首部的字节长度及所述身体部分的字节长度;其中,所述非数组对象的字节长度为第一数值的整数倍,所述第一数值为合数,所述首部的字节长度为所述第一数值的因数的整数倍;

字节长度确定子模块,用于将所述因数确定为字节切分长度。

可选地,该序列化装置还包括:引用对象写入模块,用于当所述非数组对象中存储有引用类型字段时,将所述引用类型字段指向的对象写入所述序列器。

可选地,目标对象的存储结构类型为基本类型数组,目标对象为基本类型数组对象,目标序列器为基本类型数组对象序列器;对应地,序列器序列化模块903的具体结构包括:数组元素获取子模块及数组元素写入子模块;其中:

数组元素获取子模块,用于触发所述基本类型数组对象序列器获取所述基本类型数组对象的全部数组元素;其中,所述数组元素的类型为基本类型;

数组元素写入子模块,用于将所述全部数组元素写入所述序列。

可选地,上述任意一种序列化装置还可以包括:目标序列器类编译模块及目标序列器实例化模块;其中:

目标序列器类编译模块,用于在未获取到目标序列器的情况下,生成与所述目标对象对应的目标序列器类;

目标序列器实例化模块,用于对所述目标序列器类进行实例化,以获得目标序列器。

具体地,在目标对象对应的类为非数组对象类,非数组对象类包含若干个字段的情况下,目标序列器类编译模块可以包括:切分点确定子模块及写入方法生成子模块;其中:

切分点确定子模块,用于依据预设切分规则,在所述若干个字段的堆内存中确定若干个切分点;

写入方法生成子模块,用于针对每个所述切分点,生成各自对应的堆内存序列写入方法,以获得所述非数组对象的目标序列器类;其中,所述堆内存序列写入方法用于将所述非数组对象在堆内存中存储的字段写入序列中。

对应上述本申请提供的反序列化方法实施例,本申请提供了一种反序列化装置,参照图10,其示出了反序列化装置的具体结构,该装置具体包括:序列器索引获取模块1001、序列器获取模块1002、元数据获取模块1003及序列器反序列化模块1004;其中:

序列器索引获取模块1001,用于在序列中,获取序列器的索引;其中,所述序列中包括序列器的索引及对象字节流;

序列器获取模块1002,用于在序列器池中,获取与所述序列器的索引对应的目标序列器;

元数据获取模块1003,用于获取所述目标序列器中存储的元数据;

序列器反序列化模块1004,用于触发所述目标序列器依据所述元数据,将所述序列中的对象字节流生成目标对象。

需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括上述要素的过程、方法、物品或者设备中还存在另外的相同要素。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1