首页> 中国专利> 序列化方法、反序列化方法以及相关装置

序列化方法、反序列化方法以及相关装置

摘要

本申请公开了序列化方法、反序列化方法以及相关装置,序列化方法包括:获取第一集合、第二集合和第一映射关系表;其中,第一集合用于存储已序列化对象的第一地址,第二集合用于存储待序列化对象的第一地址,第一映射关系表用于存储第一地址与对应的已序列化对象的绝对偏移值之间的映射关系;将与第二集合中每个第二地址对应的待序列化对象写入序列化数据中,并将待序列化对象的绝对偏移值写入第一映射关系表;响应于已序列化对象存在对应的引用对象,获得已序列化对象的绝对偏移值和对应引用对象的绝对偏移值之间的相对偏移值,并将相对偏移值写入序列化数据。可以使得序列化算法不受对象之间引用深度的影响。

著录项

  • 公开/公告号CN114519051A

    专利类型发明专利

  • 公开/公告日2022-05-20

    原文格式PDF

  • 申请/专利权人 浙江大华技术股份有限公司;

    申请/专利号CN202111605392.0

  • 发明设计人 韩建强;陈波扬;

    申请日2021-12-25

  • 分类号G06F16/22;G06F16/2458;G06F3/06;

  • 代理机构深圳市威世博知识产权代理事务所(普通合伙);

  • 代理人何倚雯

  • 地址 310051 浙江省杭州市滨江区滨安路1187号

  • 入库时间 2023-06-19 15:24:30

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-05-20

    公开

    发明专利申请公布

说明书

技术领域

本申请涉及计算机数据结构技术领域,特别是涉及一种序列化方法、反序列化方法以及相关装置。

背景技术

结构化数据是指使用统一的格式或数据结构存储的数据,其每一个数据域都有明确的含义,计算机可以非常快速高效地访问结构化数据的内容。序列化是指把对象转换为字节序列的过程称为对象的序列化;反序列化是指把字节序列恢复为对象的过程称为对象的反序列化。序列化的数据适合于计算机存储以及网络传输,而反序列化的对象适合于存放在计算机内存中,供算法进行处理和访问。在深度学习领域,通常把训练好的模型数据通过序列化的方法后存储到文件,然后在另外一个设备上读取文件,进行反序列化,获得模型数据结构后进行后续的处理(比如前向推理)。

目前,序列化数据一般需要进行反序列化后得到结构化数据,才能供程序进行高效访问。比如Google公司的protobuf协议就提供了序列化和反序列化功能,被广泛应用于深度学习领域的模型结构中。Flatbuffer是Google提供的另一套序列化框架,其中一个优点是序列化数据无需进行反序列化,就能进行比较高效的数据访问,但是使用递归算法时,很容易因程序栈占用太多空间而导致程序崩溃,比原生的结构化对象访问稍慢一些。因此,亟需一种新的序列化方法来解决上述问题。

发明内容

本申请主要解决的技术问题是提供一种序列化方法、反序列化方法以及相关装置,可以避免使用递归算法时受到对象之间引用深度的影响。

为解决上述技术问题,本申请采用的一个技术方案是:提供一种序列化方法,包括:获取第一集合、第二集合和第一映射关系表;其中,所述第一集合用于存储已序列化对象的第一地址,所述第二集合用于存储待序列化对象的第一地址,所述第一映射关系表用于存储所述第一地址与对应的已序列化对象在序列化数据中的绝对偏移值之间的映射关系;针对所述第二集合中的每个所述第二地址,将与所述第二地址对应的所述待序列化对象写入已序列化对象形成的序列化数据中,并将所述待序列化对象在所述序列化数据中的绝对偏移值写入所述第一映射关系表;响应于所述已序列化对象存在对应的引用对象,获得所述已序列化对象在序列化数据中的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值,并将所述相对偏移值写入所述序列化数据。

其中,所述响应于所述已序列化对象存在对应的引用对象,获得所述已序列化对象的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值,并将所述相对偏移值写入所述序列化数据的步骤之前,包括:响应于所述第二集合为空,遍历所述第一集合中的所有所述已序列化对象的第一地址;针对每个所述已序列化对象,利用所述第一地址和所述第一映射关系表获得所述已序列化对象在所述序列化数据中的绝对偏移值,并遍历所述已序列化对象对应的所有引用对象。

其中,所述获得所述已序列化对象的绝对偏移值和对应的所述引用对象的绝对偏移值之间的相对偏移值的步骤,包括:从所述第一映射关系表中获得所述引用对象在所述序列化数据中的绝对偏移值;将所述引用对象的绝对偏移值和所述已序列化对象的绝对偏移值作差以获得所述已序列化对象和所述引用对象之间的相对偏移值。

其中,所述针对所述第二集合中的每个第二地址,将与所述第二地址对应的所述待序列化对象写入已序列化对象形成的序列化数据中,并将所述待序列化对象在所述序列化数据中的绝对偏移值写入所述第一映射关系表的步骤之后,还包括:响应于所述已序列化对象不存在对应的引用对象,将所述序列化数据中相应位置处的相对偏移值设置为预设值。

其中,所述针对所述第二集合中的每个第二地址,将与所述第二地址对应的所述待序列化对象写入已序列化对象形成的序列化数据中,并将所述待序列化对象在所述序列化数据中的绝对偏移值写入所述第一映射关系表的步骤之前,包括:获得所有所述待序列化对象的内存值,并根据所述内存值的大小顺序获得每个所述待序列化对象在所述序列化数据中的第二地址。

为解决上述技术问题,本申请采用的另一个技术方案是:提供一种反序列化方法,包括:获取第三集合、第四集合和第二映射关系表;其中,所述第三集合用于存储已反序列化对象在序列化数据中的绝对偏移值,所述第四集合用于存储待反序列化对象在序列化数据中的绝对偏移值,所述第二映射关系表用于存储所述绝对偏移值与对应的反序列化对象的地址之间的映射关系;针对所述第四集合中的每个所述绝对偏移值,将与所述绝对偏移值对应的所述待反序列化对象写入已反序列化对象形成的分配空间中,并将所述待反序列化对象在所述分配空间中的地址写入所述第二映射关系表;响应于所述已反序列化对象与对应的引用对象之间的相对偏移值为非预设值,获得所述引用对象的第三地址,并将所述第三地址写入对应的已反序列化对象的指针中。

其中,所述响应于所述已反序列化对象与对应的引用对象之间的相对偏移值为非预设值,获得所述引用对象的第三地址,并将所述第三地址写入对应的已反序列化对象的指针中的步骤之前,包括:响应于所述第四集合为空,遍历所述第三集合中的所有所述已反序列化对象在所述序列化数据中的绝对偏移值;针对每个所述已反序列化对象,利用所述绝对偏移值和所述第二映射关系表获得所述已反序列化对象在所述分配空间中的第四地址,并遍历所有所述已反序列化对象对应的引用对象。

其中,所述获得所述引用对象的第三地址的步骤,包括:针对每个所述引用对象,从所述序列化数据中获得所述已反序列化对象与所述引用对象之间的相对偏移值、以及根据所述第四地址从所述第二映射表中获得与所述引用对象对应的已反序列化对象在所述序列化数据中的绝对偏移值;将所述相对偏移值与所述已反序列化对象在所述序列化数据中的偏移绝对值的和值作为所述引用对象在所述序列化数据中的绝对偏移值;利用所述引用对象在所述序列化数据中的绝对偏移值和所述第二映射关系表获得所述引用对象对应的第三地址。

其中,所述针对所述第四集合中的每个所述绝对偏移值,将与所述绝对偏移值对应的所述待反序列化对象写入已反序列化对象形成的分配空间中,并将所述待反序列化对象在所述分配空间中的地址写入所述第二映射关系表的步骤之后,还包括:响应于所述相对偏移值为预设值,将所述分配空间中所述已反序列化对象相应的指针设置为空。

为解决上述技术问题,本申请采用的又一个技术方案是:提供一种电子设备,包括相互耦接的存储器和处理器,所述存储器内存储有程序指令,所述处理器用于执行所述程序指令以实现上述任一实施例所提及的序列化方法或者反序列化方法。

为解决上述技术问题,本申请采用的又一个技术方案是:提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序用于实现上述任一实施例所提及的序列化方法或者反序列化方法。

区别于现有技术的情况,本申请的有益效果是:本申请提供的序列化方法包括:获取用于存储已序列化对象的第一地址的第一集合、用于存储待序列化对象的第一地址的第二集合和用于存储所述第一地址与对应的已序列化对象在序列化数据中的绝对偏移值之间的映射关系的第一映射关系表;针对第二集合中的每个第二地址,将与第二地址对应的待序列化对象写入已序列化对象形成的序列化数据中,并将待序列化对象在序列化数据中的绝对偏移值写入第一映射关系表;响应于序列化对象存在对应的引用对象,获得已序列化对象在序列化数据中的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值,并将相对偏移值写入序列化数据。通过这种设计方式,可以避免使用递归算法时受到对象之间引用深度的影响,避免因程序栈占用太多空间而导致程序崩溃的问题。

附图说明

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

图1是数据结构在内存中的存储示意图;

图2是与图1相对应的序列化之后的结果示意图;

图3是本申请所提供的序列化反序列化算法的整体流程图;

图4是本申请序列化方法一实施方式的流程示意图;

图5是图4中步骤S3之前一实施方式的流程示意图;

图6是图4中步骤S4对应的一实施方式的流程示意图;

图7是本申请反序列化方法一实施方式的流程示意图;

图8是图7中步骤S32之前一实施方式的流程示意图;

图9是图7中步骤S34对应的一实施方式的流程示意图;

图10是本申请序列化系统和反序列化系统一实施方式的结构示意图;

图11是本申请电子设备一实施方式的框架示意图;

图12是本申请计算机可读存储介质一实施方式的框架示意图。

具体实施方式

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

请一并参阅图1和图2,图1是数据结构在内存中的存储示意图,图2是与图1相对应的序列化之后的结果示意图。如图1所示,将数据结构的其中一个对象(例如,对象A、对象B、对象C、对象D、对象E)的成员分为两种类型,即基本数据类型和对其他对象的引用,例如,对象A的引用对象为对象B。基本数据类型是占用内存大小固定的数据,在对象中直接分配相应的数据空间存储其值,比如各种宽度的整数和浮点数。对于其他数据的引用,在内存中一般使用指针表示,通过该指针就可以访问其引用的对象。如果引用的对象是不存在的,此时指针的值为空(NULL)。因为一个指针的占用的空间大小也是固定的,所以整个对象的存储空间的大小也是固定的,但是不允许在一个对象(父对象)内部直接包含另一个对象(子对象)的情形,此时应把子对象独立为一个对象,而在父对象中加入对子对象的引用。如图1和图2所示,序列化数据的存储格式为将序列化后一个对象的所有成员(包括基本数据类型和对其他对象的引用)连续存储,在获得该对象起始地址的情况下,访问程序可以通过固定的偏移访问某一个指定的成员。对于引用对象,将偏移值存储在序列化的数据中,其中偏移值的计算方式为:偏移值=被引用对象的起始地址–引用所属对象的起始地址,通过这个偏移值,就可以非常方便地获取到被引用对象的地址。具体而言,当这个偏移值为零时,就是一个对象对其自身的引用。一般情况下,要求对象的起始位置是4字节对齐的,如果偏移值不是4的倍数,那么该偏移值就不是合法的偏移值。我们可以用任意这样的值来表示引用对象不存在,本申请在此不作限定。较佳地,在本实施例中,可以设置偏移值为用1或者-1来表示引用对象不存在。具体地,在本实施例中,当偏移值为正数时,表示对序列化数据中后面对象的引用;当偏移值为负数时,表示对序列化数据中前面对象的引用。目前技术中仅FlatBuffer中使用偏移量对其他对象进行引用,而且偏移值是正数,只能单向引用,不支持反向引用或自我引用。通过这种设计方式,突破了FlatBuffer序列化数据的结构限制,不再要求数据具有树形结构,无需定义顶层对象数据类型,从而使得对象之间允许有交叉引用,循环引用和自我引用的情况,基本上可以对任意的结构化数据进行序列化。因为在序列化数据中通过相对偏移值为正数、为负数和为零实现对序列化数据中后面的对象、前面的对象以及对象自身的引用,通过特定的偏移值(比如1或-1)来表示引用对象不存在的情况。

请参阅图3,图3是本申请所提供的序列化反序列化算法的整体流程图。如图3所示,算法过程分为两部分:第一部分为序列化或反序列化的对象分配空间,完成基础数据类型的处理,并建立处理前后对象的映射关系;第二部分结合处理前后对象的映射关系,和处理前的对象引用关系,生成处理后的对象引用关系,即完成指针和相对偏移量之间的相互转换。

下面开始将序列化方法和反序列化方法分别进行详细阐述。

序列化的过程为序列化的输入为一个内存中的对象,输出为序列化后的数据。序列化数据中包含了此对象以及其直接引用和间接引用的所有对象的成员,并且序列化数据的起始位置存储的就是输入指定的对象。对于被引用的对象,则不保证序列化的先后顺序。在序列化过程中,序列化之前的对象用其地址来表示;序列化后的对象用其存储位置在序列化数据中的绝对偏移来表示。序列化对象既可以表示序列化之前的对象,即需要序列化的对象,也可以表示序列化之后的对象,用地址时表示序列化之前的对象,用绝对偏移值时表示序列化之后的对象。

在本实施例中,首先可以获得堆内存中的Java对象数据等结构化数据,再通过本申请所提供的序列化方法把上述Java对象数据等结构化数据存储到磁盘文件中或者传递给其他网络节点。请参阅图4,图4是本申请序列化方法一实施方式的流程示意图。上述序列化方法包括:

S1:获取第一集合、第二集合和第一映射关系表。

具体而言,第一集合Set1用于存储已序列化对象的第一地址,第二集合Set2用于存储待序列化对象的第一地址,第一映射关系表Map1用于存储第一地址与对应的已序列化对象在序列化数据中的绝对偏移值之间的映射关系。在本实施例中,第一集合Set1的初始状态为空,第二集合Set2的初始状态为仅包含输入指定的对象,第一映射关系表Map1的初始状态为空。

S2:针对第二集合中的每个第二地址,将与第二地址对应的待序列化对象写入已序列化对象形成的序列化数据中,并将待序列化对象在序列化数据中的绝对偏移值写入第一映射关系表。

具体而言,当从第二集合Set2中取出一个待序列化对象时,同时将该待序列化对象从Set2中删除,避免使用递归算法容易因程序栈占用太多空间而导致程序崩溃的问题。

优选地,在本实施例中,步骤S2之前包括:获得所有待序列化对象的内存值,并根据内存值的大小顺序获得每个待序列化对象在序列化数据中的第二地址。具体而言,计算获得所有待序列化对象的内存值,将每个待序列化对象在序列化数据中根据内存值的大小顺序分配空间。

具体地,在本实施例中,对于该待序列化对象的所有引用对象,逐个判断引用对象是否在第一集合Set1或第二集合Set2中存在,如果引用对象在第一集合Set1或第二集合Set2中都不存在,则将该引用对象添加到第二集合Set2中。如果引用对象仅在第一集合Set1中存在,说明该引用对象已经序列化,无需添加到第二集合Set2中。在本实施例中,所有序列化对象都是先进入第二集合Set2,经过序列化之后转移到第一集合Set1。第一集合Set1中的对象只增不减。不管引用对象是存在于第一集合Set1或是存在于第二集合Set2中,都说明该引用对象已经在其他地方被引用,属于重复引用(或多次引用)的对象,此时都不需要对第一集合Set1或第二集合Set2进行任何修改。

S3:判断已序列化对象是否存在对应的引用对象。

请参阅图5,图5是图4中步骤S3之前一实施方式的流程示意图。具体地,步骤S3之前包括:

S10:判断第二集合是否为空。

具体而言,判断第二集合Set2是否为空的目的是判断第二集合Set2中的待序列化对象是否都进入第一集合Set1中。

S11:若是,则遍历第一集合中的所有已序列化对象的第一地址。

具体而言,若第二集合Set2为空,则说明第二集合Set2中的待序列化对象都进入到第一集合Set1中转化为已序列化对象,此时遍历第一集合Set1中的所有已序列化对象以及所有已序列化对象的第一地址。

S12:针对每个已序列化对象,利用第一地址和第一映射关系表获得已序列化对象在序列化数据中的绝对偏移值,并遍历已序列化对象对应的所有引用对象。

具体而言,针对每个已序列化对象,从第一映射关系表Map1中查询获得与第一地址对应的已序列化对象在序列化数据中的绝对偏移值,并遍历该已序列化对象对应的所有引用对象。

S13:否则,返回至步骤S2。

具体而言,若第二集合Set2不为空,则说明第二集合Set2中的待序列化对象并未全部进入到第一集合Set1中转化为已序列化对象,此时返回至针对第二集合中的每个第二地址,将与第二地址对应的待序列化对象写入已序列化对象形成的序列化数据中,并将待序列化对象在序列化数据中的绝对偏移值写入第一映射关系表的步骤,确保第二集合Set2中的待序列化对象全部进入到第一集合Set1中转化为已序列化对象。

S4:若是,则获得已序列化对象在序列化数据中的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值,并将相对偏移值写入序列化数据。

具体地,在本实施例中,请参阅图6,图6是图4中步骤S4对应的一实施方式的流程示意图。具体而言,若已序列化对象存在对应的引用对象,也就是若引用对象对应的指针不为空时,步骤S4中获得已序列化对象的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值的步骤包括:

S20:从第一映射关系表中获得引用对象在序列化数据中的绝对偏移值。

具体而言,从第一映射关系表Map1中查询获得已序列化对象对应的引用对象的绝对偏移值。

S21:将引用对象的绝对偏移值和已序列化对象的绝对偏移值作差以获得已序列化对象和引用对象之间的相对偏移值。

具体而言,已序列化对象和引用对象之间的相对偏移值=引用对象的绝对偏移值-已序列化对象的绝对偏移值,计算得到两者的相对偏移值之后,将相对偏移值写入序列化数据中特定的位置,最后返回序列化后的数据。

通过这种方式,序列化后的对象无需反序列化就能实现高效的数据访问,采用相对偏移值来实现对其他对象的引用,可以方便的计算出引用对象在序列化数据中的位置。

S5:否则,将序列化数据中相应位置处的相对偏移值设置为预设值。

具体地,在本实施例中,步骤S2之后还包括:响应于已序列化对象不存在对应的引用对象,也就是响应于引用对象对应的指针为空,将序列化数据中相应位置处的相对偏移值设置为预设值。具体而言,若第一映射关系表Map1中不存在与第一地址对应的引用对象的绝对偏移值,则将序列化数据中相应位置处的相对偏移值设置为预设值,在本实施例中,预设值可以为1或-1等,本申请在此不作限定。

通过这种设计方式,在序列化方法中通过集合存储已序列化对象和待序列化对象,通过集合元素的添加和删除,可以避免使用递归算法时受到对象之间引用深度的影响,避免因程序栈占用太多空间而导致程序崩溃的问题。

反序列化过程为反序列化是序列化的逆过程,输入为序列化后的数据(即已序列化对象的起始地址),输出的返回值为序列化数据中第一个对象反序列化后的指针。反序列化之后,对象之间的引用关系从偏移值改为指针引用。在反序列化过程中,反序列化之前的对象(即序列化后得到的对象)用其在序列化数据中的绝对偏移值表示,反序列之后的对象用其在内存中的地址表示。反序列化对象既可以表示反序列化之前的对象(即需要反序列化的对象),也可以表示反序列化之后的对象,用地址时表示反序列化之后的对象,用绝对偏移值表示反序列化之前的对象。

在本实施例中,获得磁盘文件中的对象数据、网络节点上的对象数据等,针对上述对象数据中的待反序列化对象进行反序列化,以将这些对象数据恢复成Java对象模型。请参阅图7,图7是本申请反序列化方法一实施方式的流程示意图。上述反序列化方法包括:

S30:获取第三集合、第四集合和第二映射关系表。

具体而言,第三集合用于存储已反序列化对象在序列化数据中的绝对偏移值,第四集合用于存储待反序列化对象在序列化数据中的绝对偏移值,第二映射关系表用于存储绝对偏移值与对应的反序列化对象的地址之间的映射关系。在本实施例中,第三集合Set3的初始状态为空,第四集合Set4的初始状态为包含偏移值为零,第二映射关系表Map2的初始状态为空。

S31:针对第四集合中的每个绝对偏移值,将与绝对偏移值对应的待反序列化对象写入已反序列化对象形成的分配空间中,并将待反序列化对象在分配空间中的地址写入第二映射关系表。

具体而言,当从第四集合Set4中取出一个待反序列化对象时,同时将该待反序列化对象从Set4中删除,避免使用递归算法容易因程序栈占用太多空间而导致程序崩溃的问题。

优选地,在本实施例中,步骤S31之前包括:在内存空间中为每个待反序列化对象分配空间,分配的依据可以根据实际情况进行设定,本申请在此不作限定。

具体地,在本实施例中,对于已反序列化对象中所有的引用对象,从已反序列化对象中读取相对偏移值,如果相对偏移值为预设值,比如1或-1等,表示该已反序列化对象的引用对象为空,则对此不作处理;如果相对偏移值不是预设值,表示该已反序列化对象存在引用对象,则通过计算获得引用对象的绝对偏移值,计算公式为引用对象的绝对偏移值=已反序列化对象的绝对偏移值+相对偏移值。接着判断该引用对象的绝对偏移值是否在第三集合Set3或第四集合Set4中存在;如果不存在,则将该引用对象的绝对偏移值添加到第四集合Set4中。

S32:判断已反序列化对象与对应的引用对象之间的相对偏移值是否为预设值。

请参阅图8,图8是图7中步骤S32之前一实施方式的流程示意图。

具体地,步骤S32之前包括:

S320:判断第四集合是否为空。

具体而言,判断第四集合Set4是否为空的目的是判断第四集合Set4中的待反序列化对象是否都进入第三集合Set3中。

S321:若是,则遍历第三集合中的所有已反序列化对象在序列化数据中的绝对偏移值。

具体而言,若第四集合Set4为空,则说明第四集合Set4中的待反序列化对象都进入到第三集合Set3中转化为已反序列化对象,此时遍历第三集合Set3中的所有已反序列化对象在序列化数据中的绝对偏移值。

S322:针对每个已反序列化对象,利用绝对偏移值和第二映射关系表获得已反序列化对象在分配空间中的第四地址,并遍历已反序列化对象对应的所有引用对象。

具体而言,针对每个已反序列化对象,从第二映射关系表Map2中查询获得与绝对偏移值对应的已反序列化对象在分配空间中的第四地址,并遍历该已序列化对象对应的所有引用对象。

S324:否则,返回至步骤S31。

具体而言,若第四集合Set4不为空,则说明第四集合Set4中的待反序列化对象并未全部进入到第三集合Set3中,返回至针对第四集合中的每个绝对偏移值,将与绝对偏移值对应的待反序列化对象写入已反序列化对象形成的分配空间中,并将待反序列化对象在分配空间中的地址写入第二映射关系表的步骤。

S33:若是,则将分配空间中已反序列化对象相应的指针设置为空。

具体而言,若相对偏移值为预设值(例如,1或-1等),则将分配空间中已反序列化对象相应的指针设置为空。

S34:否则,获得引用对象的第三地址,并将第三地址写入对应的已反序列化对象的指针中。

具体而言,若相对偏移值不是预设值(例如,1或-1等),说明该已反序列化对象存在引用对象,则获得引用对象的第三地址,并将第三地址写入对应的已反序列化对象的指针中。

通过这种设计方式,在反序列化方法中通过集合存储已反序列化对象和待反序列化对象,通过集合元素的添加和删除,可以避免使用递归算法时受到对象之间引用深度的影响,避免因程序栈占用太多空间而导致程序崩溃的问题。

具体地,在本实施例中,请参阅图9,图9是图7中步骤S34对应的一实施方式的流程示意图。具体而言,步骤S34中获得引用对象的第三地址的步骤包括:

S340:针对每个引用对象,从序列化数据中获得已反序列化对象与引用对象之间的相对偏移值、以及根据第四地址从第二映射表中获得与引用对象对应的已反序列化对象在序列化数据中的绝对偏移值。

S341:将相对偏移值与已反序列化对象在序列化数据中的偏移绝对值的和值作为引用对象在序列化数据中的绝对偏移值。

具体而言,计算公式为:引用对象在序列化数据中的绝对偏移值=相对偏移值+已反序列化对象在序列化数据中的偏移绝对值。

S342:利用引用对象在序列化数据中的绝对偏移值和第二映射关系表获得引用对象对应的第三地址。

具体而言,步骤S341中获得引用对象在序列化数据中的绝对偏移值之后,从第二映射关系表中Map1中获得与引用对象在序列化数据中的绝对偏移值相对应的引用对象在分配空间中的第三地址,之后进入至将第三地址写入对应的已反序列化对象的指针中的步骤,最后返回第一个反序列对象在内存中的地址。

通过这种设计方式,可以避免使用递归算法时受到对象之间引用深度的影响,避免因程序栈占用太多空间而导致程序崩溃的问题。

请参阅图10,图10是本申请序列化系统和反序列化系统一实施方式的结构示意图。如图10a所示,序列化系统具体包括:

第一获取模块10,用于获取第一集合、第二集合和第一映射关系表;其中,第一集合用于存储已序列化对象的第一地址,第二集合用于存储待序列化对象的第一地址,第一映射关系表用于存储第一地址与对应的已序列化对象在序列化数据中的绝对偏移值之间的映射关系。

第一写入模块12,与第一获取模块10耦接,用于针对第二集合中的每个第二地址,将与第二地址对应的待序列化对象写入已序列化对象形成的序列化数据中,并将待序列化对象在序列化数据中的绝对偏移值写入第一映射关系表。

偏移值模块14,与第一写入模块12耦接,用于响应于第一映射关系表中存在已序列化对象的引用对象的绝对偏移值,获得已序列化对象在序列化数据中的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值。此外,第一写入模块12还用于将相对偏移值写入序列化数据。

具体地,如图10b所示,反序列化系统具体包括:

第二获取模块20,用于获取第三集合、第四集合和第二映射关系表;其中,第三集合用于存储已反序列化对象在序列化数据中的绝对偏移值,第四集合用于存储待反序列化对象在序列化数据中的绝对偏移值,第二映射关系表用于存储绝对偏移值与对应的反序列化对象的地址之间的映射关系。

第二写入模块22,与第二获取模块20耦接,用于针对第四集合中的每个绝对偏移值,将与绝对偏移值对应的待反序列化对象写入已反序列化对象形成的分配空间中,并将待反序列化对象在分配空间中的地址写入第二映射关系表。

地址模块24,与第二写入模块22藕接,用于响应于已反序列化对象与对应的引用对象之间的相对偏移值为非预设值,获得引用对象的第三地址。此外,第二写入模块22还用于将第三地址写入对应的已反序列化对象的指针中。

请参阅图11,图11是本申请电子设备一实施方式的框架示意图。该电子设备包括相互耦接的存储器30和处理器32。具体地,在本实施例中,存储器30内存储有程序指令,处理器32用于执行程序指令以实现上述任一实施例所提及的序列化方法或者反序列化方法。

具体而言,处理器32还可以称为CPU(Central Processing Unit,中央处理单元)。处理器32可能是一种集成电路芯片,具有信号的处理能力。处理器32还可以是通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(ApplicationSpecific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable GateArray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。另外,处理器32可以由多个集成电路芯片共同实现。

请参阅图12,图12是本申请计算机可读存储介质一实施方式的框架示意图。该计算机可读存储介质40存储有计算机程序400,能够被计算机所读取,计算机程序400能够被处理器执行,以实现上述任一实施例中所提及的序列化方法或者反序列化方法。其中,该计算机程序400可以以软件产品的形式存储在上述计算机可读存储介质40中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施方式所述方法的全部或部分步骤。具有存储功能的计算机可读存储介质40可以是U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质,或者是计算机、服务器、手机、平板等终端设备。

总而言之,区别于现有技术的情况,本申请提供的序列化方法包括:获取用于存储已序列化对象的第一地址的第一集合、用于存储待序列化对象的第一地址的第二集合和用于存储所述第一地址与对应的已序列化对象在序列化数据中的绝对偏移值之间的映射关系的第一映射关系表;针对第二集合中的每个第二地址,将与第二地址对应的待序列化对象写入已序列化对象形成的序列化数据中,并将待序列化对象在序列化数据中的绝对偏移值写入第一映射关系表;响应于已序列化对象存在对应的引用对象,获得已序列化对象在序列化数据中的绝对偏移值和对应的引用对象的绝对偏移值之间的相对偏移值,并将相对偏移值写入序列化数据。通过这种设计方式,可以避免使用递归算法时受到对象之间引用深度的影响,避免因程序栈占用太多空间而导致程序崩溃的问题。

以上所述仅为本申请的实施方式,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号