一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

多叉树信息序列化和反序列化方法、设备和计算机可读存储介质与流程

2022-11-30 14:19:54 来源:中国专利 TAG:


1.本技术涉及计算机网络安全领域,尤其涉及多叉树信息序列化和反序列化方法、设备和计算机可读存储介质。


背景技术:

2.由于多叉树属于较为复杂的数据结构,其节点信息无法直接存储和/或传输,因此,需要对多叉树信息进行一些特殊处理,例如序列化成二进制数据;当需要使用这些多叉树信息时,再对特殊处理后的多叉树信息执行与该特殊处理的相反操作,例如反序列化,从而得到原进程树信息。相关技术中,多叉树信息序列化和反序列化方法需要首先对多叉树信息进行第一操作,得到一个中间结果,再对这个中间结果进行第二操作,才能得到最终的处理结果;在后续需要使用多叉树信息时,亦需要经过两次相反的操作才得到原多叉树信息。综上,相关技术在对多叉树信息处理时存在效率较差的问题。


技术实现要素:

3.为解决或部分解决相关技术中存在的问题,本技术提供一种多叉树信息序列化和反序列化方法、装置、设备和计算机可读存储介质,可以对多多叉树信息进行高效处理。
4.本技术第一方面提供一种多叉树信息序列化方法,包括:
5.获取目标多叉树的属性信息,所述属性信息包括所述目标多叉树各节点自身数据的长度、所述目标多叉树的总节点数以及所述目标多叉树各节点序列化后序列化结果所需缓存大小;
6.申请与所述目标多叉树的属性信息相符的内存;
7.依次向所述内存写入所述目标多叉树各节点序列化后序列化结果所需缓存大小和所述目标多叉树的总节点数;
8.以预设遍历方式遍历所述目标多叉树各节点,并按照遍历顺序向所述内存的剩余存储空间写入所述目标多叉树各节点自身数据。
9.本技术第二方面提供一种多叉树信息反序列化方法,包括:
10.获取内存首地址,所述内存为序列化目标多叉树各节点时申请的与所述目标多叉树的属性信息相符的内存,所述属性信息包括所述目标多叉树各节点自身数据的长度、所述目标多叉树的总节点数以及所述目标多叉树各节点序列化后序列化结果所需缓存大小;
11.根据所述内存首地址、所述目标多叉树的总节点数预设存储空间以及所述目标多叉树各节点序列化后序列化结果所需缓存大小,计算所述目标多叉树的根节点地址;
12.根据所述目标多叉树的根节点地址和所述目标多叉树的各节点自身数据的长度,获取所述根节点各子节点地址,所述根节点各子节点地址的获取顺序为序列化所述目标多叉树各节点时以预设遍历方式遍历所述目标多叉树各节点时的遍历顺序;
13.从所述根节点各子节点地址对应存储单元读取所述根节点各子节点的自身数据;
14.根据所述根节点各子节点的自身数据,获取所述根节点各子节点的父节点地址和子节点地址;
15.从所述根节点各子节点的父节点地址和子节点地址对应存储单元读取所述根节点各子节点的父节点和子节点的自身数据。
16.本技术第三方面提供一种多叉树信息序列化装置,包括:
17.第一获取模块,用于获取目标多叉树的属性信息,所述属性信息包括所述目标多叉树各节点自身数据的长度、所述目标多叉树的总节点数以及所述目标多叉树各节点序列化后序列化结果所需缓存大小;
18.申请模块,用于申请与所述目标多叉树的属性信息相符的内存;
19.第一写入模块,用于依次向所述内存写入所述目标多叉树各节点序列化后序列化结果所需缓存大小和所述目标多叉树的总节点数;
20.第二写入模块,用于以预设遍历方式遍历所述目标多叉树各节点,并按照遍历顺序向所述内存的剩余存储空间写入所述目标多叉树各节点自身数据。
21.本技术第三方面提供一种多叉树信息反序列化装置,包括:
22.第二获取模块,用于获取内存首地址,所述内存为序列化目标多叉树各节点时申请的与所述目标多叉树的属性信息相符的内存,所述属性信息包括所述目标多叉树各节点自身数据的长度、所述目标多叉树的总节点数以及所述目标多叉树各节点序列化后序列化结果所需缓存大小;
23.计算模块,用于根据所述内存首地址、所述目标多叉树的总节点数预设存储空间以及所述目标多叉树各节点序列化后序列化结果所需缓存大小,计算所述目标多叉树的根节点地址;
24.第三获取模块,用于根据所述目标多叉树的根节点地址和所述目标多叉树的各节点自身数据的长度,获取所述根节点各子节点地址,所述根节点各子节点地址的获取顺序为序列化所述目标多叉树各节点时以预设遍历方式遍历所述目标多叉树各节点时的遍历顺序;
25.第一读取模块,用于从所述根节点各子节点地址对应存储单元读取所述根节点各子节点的自身数据;
26.第四获取模块,用于根据所述根节点各子节点的自身数据,获取所述根节点各子节点的父节点地址和子节点地址;
27.第二读取模块,用于从所述根节点各子节点的父节点地址和子节点地址对应存储单元读取所述根节点各子节点的父节点和子节点的自身数据。
28.本技术第五方面提供一种电子设备,包括:
29.处理器;以及
30.存储器,其上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如上所述的方法。
31.本技术第六方面提供一种计算机可读存储介质,其上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如上所述的方法。
32.本技术提供的技术方案可以包括以下有益效果:不同于相关技术在序列化多叉树信息时需要进行两次序列化操作,本技术的技术方案在获取目标多叉树的属性信息并申请
与目标多叉树的属性信息相符的内存之后,依次向内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数以及按照遍历顺序向内存的剩余存储空间写入目标多叉树各节点自身数据,即本技术的技术方案仅仅只需要进行一次序列化操作即可完成多叉树信息的序列化,因此具有序列化高效的优点。
33.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本技术。
附图说明
34.通过结合附图对本技术示例性实施方式进行更详细地描述,本技术的上述以及其它目的、特征和优势将变得更加明显,其中,在本技术示例性实施方式中,相同的参考标号通常代表相同部件。
35.图1是本技术实施例示出的多叉树信息序列化方法的流程示意图;
36.图2是本技术实施例示出的依次向内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数的示意图;
37.图3是本技术实施例示出的按照遍历顺序向内存的余下存储空间写入目标多叉树各节点自身数据的示意图;
38.图4是本技术实施例示出的依次向内存的第二余下存储空间写入图3示例的多叉树各节点的变长数据和各节点的定长数据中偏移数据的指向的示意图;
39.图5是本技术实施例示出的多叉树信息反序列化方法的流程示意图;
40.图6是本技术实施例示出的多叉树信息序列化装置的结构示意图;
41.图7是本技术实施例示出的多叉树信息反序列化装置的结构示意图;
42.图8是本技术实施例示出的电子设备的结构示意图。
具体实施方式
43.下面将参照附图更详细地描述本技术的实施方式。虽然附图中显示了本技术的实施方式,然而应该理解,可以以各种形式实现本技术而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本技术更加透彻和完整,并且能够将本技术的范围完整地传达给本领域的技术人员。
44.在本技术使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本技术。在本技术和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
45.应当理解,尽管在本技术可能采用术语“第一”、“第二”、“第三”等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本技术范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个该特征。在本技术的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
46.多叉树属于较为复杂的数据结构,其节点信息无法直接存储和/或传输,因此,需
要对多叉树信息进行一些特殊处理,例如序列化成二进制数据;当需要使用这些多叉树信息时,再对特殊处理后的多叉树信息执行与该特殊处理的相反操作,例如反序列化,从而得到原进程树信息。相关技术中,多叉树信息序列化和反序列化方法需要首先对多叉树信息进行第一操作,得到一个中间结果,再对这个中间结果进行第二操作,才能得到最终的处理结果,例如,使用序列化工具protobuf或json先将多叉树序列化成数组,然后再次使用序列化工具protobuf或json将该数组序列化为二进制数据;在后续需要使用多叉树信息时,亦需要经过两次相反的操作才得到原多叉树信息。综上,相关技术在对多叉树信息处理时存在效率较差的问题。
47.针对上述问题,本技术实施例提供一种多叉树信息序列化和反序列化方法,可以对多叉树信息进行高效处理。
48.以下结合附图详细描述本技术实施例的技术方案。
49.参见图1,是本技术实施例示出的多叉树信息序列化方法的流程示意图,该方法主要包括步骤s101至步骤s104,说明如下:
50.步骤s101:获取目标多叉树的属性信息,其中,属性信息包括目标多叉树各节点自身数据的长度、目标多叉树的总节点数以及目标多叉树各节点序列化后序列化结果所占存储空间。
51.在本技术实施例中,目标多叉树即为本技术实施例需要序列化的多叉树,此处的多叉树可以是一个二叉树,多叉树上的一个节点可以表示一个进程。当多叉树上的一个节点可以表示一个进程时,若该节点具有父节点,则该父节点相应地表示为父进程,若该节点具有子节点,则该子节点相应地表示为子进程。多叉树的节点信息主要包括该节点的节点标识(例如,进程标识)、该节点的父节点的标识(例如,父进程标识)、该节点是否为活动态(例如,是否为活动的进程)、该节点的创建时间(例如,进程的创建时间)、该节点的存放路径(例如,进程路径)、该节点的父节点偏移地址(例如,父进程偏移地址)、该节点的子节点个数以及该节点的子节点偏移地址数组的偏移地址(例如,子进程的偏移地址数组的偏移地址),等等。上述节点信息中,由于节点的节点标识(本技术实施例记为nid)、该节点的父节点的标识(本技术实施例记为pnid)、该节点是否为活动态(本技术实施例记为is_active)、该节点的创建时间(本技术实施例记为create_time)、该节点的父节点偏移地址和子节点个数等数据,其在内存所占空间是固定的,因此,将节点信息中上述在内存所占空间是固定的数据定义为节点的定长数据,而由于节点的子节点个数(本技术实施例记为child_count)是可变的,子节点偏移地址数组所需空间也是可变的,因此节点的存放路径的偏移地址(本技术实施例记为offset_path)和该节点的子节点偏移地址数组的偏移地址(本技术实施例记为offset_child_node)随时变化,将节点的子节点个数、节点的存放路径的偏移地址和节点的子节点偏移地址数组的偏移地址等这些随时变化的数据定义为节点的变长数据。需要说明的是,目标多叉树各节点自身数据包括节点的定长数据和节点的变长数据,其长度使用字节数(bytes)来衡量;目标多叉树各节点序列化后序列化结果所占存储空间也同样使用字节数(bytes)来衡量。此外,一个节点的父节点的信息除了包含该节点的父节点的标识本身,还包含该父节点的父节点的标识等信息。
52.步骤s102:申请与目标多叉树的属性信息相符的内存。
53.按照序列化的初衷,对目标对象进行序列化的目的是为了存储或传输,而在传输
之前一般也需要存储,因此,申请与目标多叉树的属性信息相符的内存,作为序列化之后所得结果的存储单元。作为本技术一个实施例,申请与目标多叉树的属性信息相符的内存可以是:计算目标存储空间大小;以第一预设存储空间的首地址为内存的首地址,申请存储空间为不小于目标存储空间大小的内存;此处,目标存储空间大小为第一预设存储空间、第二预设存储空间以及目标多叉树所有节点自身数据的长度之和,第一预设存储空间包括为存储目标多叉树各节点序列化后序列化结果所需缓存大小预先分配的内存空间,第二预设存储空间包括为存储目标多叉树的总节点数预先分配的内存空间。需要特别说明的是,第一预设存储空间并非指存储目标多叉树各节点序列化后序列化结果所需缓存大小,而是为了存储目标多叉树各节点序列化后序列化结果所需缓存大小而预先分配了多少内存空间。例如,目标多叉树各节点序列化后序列化结果所需缓存大小为1g(=1024m)字节,但为了存储1g这个数值,只需要为其分配4个字节(bytes)的存储空间,而不是分配1g字节的存储空间。上述实施例中,目标多叉树各节点序列化后序列化结果所需缓存大小即为了存储目标多叉树各节点序列化后的序列化结果,需要多少字节的缓存,其在数值上等于序列化结果总共包含的字节数。
54.步骤s103:依次向内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数。
55.由于目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数是最先写入经步骤s102申请的内存,且是依次写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数,这意味着目标多叉树各节点序列化后序列化结果所需缓存大小是首先写入内存的数据,其次是目标多叉树的总节点数。如前所述,假设第一预设存储空间就是为存储目标多叉树各节点序列化后序列化结果所需缓存大小预先分配的内存空间,第二预设存储空间就是为存储目标多叉树的总节点数预先分配的内存空间,则相当于以内存的首地址为写入目标多叉树各节点序列化后序列化结果所需缓存大小的首地址,内存的首地址 第一预设存储空间构成的地址范围是内存中可写入目标多叉树各节点序列化后序列化结果所需缓存大小的最大地址范围,此后,以上述最大地址范围为首地址,最大地址范围 第二预设存储空间构成的地址范围是内存中可写入目标多叉树的总节点数的最大地址范围。记目标多叉树各节点序列化后序列化结果所需缓存大小为buffer_size,目标多叉树的总节点数为node_count,并假设第一预设存储空间为4个字节(bytes),第二预设存储空间亦为4个字节(bytes),则依次向内存写入所述目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数如图2所示。
56.步骤s104:以预设遍历方式遍历目标多叉树各节点,并按照遍历顺序向内存的剩余存储空间写入目标多叉树各节点自身数据。
57.在本技术实施例中,预设遍历方式可以是广度优先遍历或深度优先遍历,在目标多叉树为二叉树时,预设遍历方式还可以是前序遍历、中序遍历或后序遍历;而遍历顺序就是以预设遍历方式遍历目标多叉树各节点时所采用的顺序。至于内存的剩余存储空间,是指向经步骤s102申请所得内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数之后,经步骤s102申请所得内存还剩下的存储空间。如前所述,目标多叉树各节点自身数据实际包含各节点的定长数据和变长数据,因此,按照遍历顺序向内存的剩余存储空间写入目标多叉树各节点自身数据实际包含向内存的剩余存储空间写
入目标多叉树各节点的定长数据和变长数据。具体地,按照遍历顺序向内存的剩余存储空间写入目标多叉树各节点自身数据可以是:按照遍历顺序,依次向经步骤s102申请所得内存的第一剩余存储空间写入目标多叉树各节点的定长数据;按照遍历顺序,依次向经步骤s102申请所得内存的第二剩余存储空间写入目标多叉树各节点的变长数据;其中,第一剩余存储空间为依次向上述内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数之后上述内存剩余的存储空间,第二剩余存储空间为依次向上述内存的第一剩余存储空间写入目标多叉树所有节点的定长数据之后上述内存剩余的存储空间。如图3所示,以目标多叉树是图中所示的多叉树为例,假设采用的是广度优先遍历,则遍历顺序是a
→b→c→d→e→
f,因此,在经步骤s102申请所得内存中存储上述节点自身的数据如图所示。具体地,作为本技术一个实施例,按照遍历顺序,依次向经步骤s102申请所得内存的第一剩余存储空间写入目标多叉树各节点的定长数据可以是:s1:向第一剩余存储空间的首地址对应存储空间写入目标多叉树根节点的定长数据;和/或s2:若根节点存在子节点,则在写入目标多叉树根节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的定长数据;和/或s3:若子节点存在子节点,则在写入子节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的子节点的定长数据;循环上述s1至s3,直至最后一个子节点的定长数据写入内存。仍然以图3示出的多叉树为例,其根节点为节点a,第一剩余存储空间的首地址实际上亦是图3示出的多叉树中节点的定长数据的起始地址。在向第一剩余存储空间的首地址对应存储空间写入目标多叉树根节点即节点a的定长数据后,由于节点a存在子节点b和子节点c,且遍历顺序(广度优先遍历)是b

c,因此,在写入目标多叉树根节点a的定长数据之后的存储空间,依次向内存写入子节点b和子节点c的定长数据;子节点b存在子节点d,而子节点c存在子节点e和子节点f,遍历顺序(广度优先遍历)是d
→e→
f,因此,在写入目标多叉树根节点a的子节点b和子节点c的定长数据之后的存储空间,按照遍历顺序,依次向内存写入子节点b的子节点d的定长数据;在写入子节点b、子节点c和子节点d的定长数据之后的存储空间,按照遍历顺序,依次向内存写入子节点c的子节点e和子节点f的定长数据。以下以目标多叉树的根节点a为例,进一步说明向内存写入其定长数据的过程,向内存写入目标多叉树的其余节点的定长数据的过程与向内存写入根节点a的定长数据的过程类似。
58.具体地,向第一剩余存储空间的首地址对应存储空间写入目标多叉树根节点的定长数据包括:向第一剩余存储空间的首地址对应存储空间写入基础数据;在写入基础数据之后,向第一剩余存储空间剩余的存储空间写入偏移数据。上述实施例中,向第一剩余存储空间的首地址对应存储空间写入的基础数据(本技术实施例记为base_data)主要包括根节点的节点标识、根节点的父节点的标识、该节点的创建时间和该节点是否为活动态,而偏移数据主要包括根节点存放路径这一数据的偏移地址、根节点存放路径这一数据所需空间(本技术实施例记为path_len)、根节点的父节点的偏移地址(本技术实施例记为offset_parent_node)、根节点的子节点偏移地址数组的偏移地址以及根节点的子节点个数。需要说明的是,由于根节点不存在父节点,因此,为了保持与其他节点的统一表述,对于根节点,仍然承认其存在父节点的偏移地址这一项,只是将其设置为0;对于根节点的父节点的标识,亦可以进行类似的特别规定。至于子节点偏移地址数组,其本质是一个由各个元素组成的数组,数组中的任意一个元素表示一个子节点的偏移地址,本技术实施例使用offset_
child_node表示子节点偏移地址数组的偏移地址。从上述对offset_path的定义可知,offset_path实际上是指向节点的存放路径(本技术实施例记为path_data,为节点的变长数据)这一数据的偏移地址,offset_child_node实际上是指向该节点多个子节点中第一个子节点的偏移地址(本技术实施例记为child1bu_offset,为节点的变长数据),对于目标多叉树中非根节点的节点,offset_parent_node实际上是指向该节点的父节点的定长数据的存储单元的起始地址。至于在写入目标多叉树的根节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的定长数据以及在写入子节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的子节点的定长数据,与上述实施例向第一剩余存储空间的首地址对应存储空间写入目标多叉树根节点的定长数据类似,具体地,若根节点存在子节点,则在写入目标多叉树的根节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的定长数据可以是:在写入目标多叉树的根节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的基础数据;在写入子节点的基础数据之后,向内存剩余的存储空间写入子节点的偏移数据,其中,子节点的基础数据包括子节点的节点标识、子节点的父节点的标识、子节点的创建时间和子节点是否为活动态,子节点的偏移数据包括子节点的存放路径的偏移地址、子节点的存放路径的长度、子节点的父节点的偏移地址、子节点的子节点偏移地址数组的偏移地址以及子节点的子节点个数;类似地,若子节点存在子节点,则在写入子节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的子节点的定长数据可以是:在写入子节点的定长数据之后的存储空间,按照遍历顺序向内存写入子节点的子节点的基础数据;在写入子节点的子节点的基础数据之后,向内存剩余的存储空间写入子节点的子节点的偏移数据,其中,子节点的子节点的基础数据包括子节点的子节点的节点标识、子节点的子节点的父节点的标识、子节点的子节点的创建时间和子节点的子节点是否为活动态,子节点的子节点的偏移数据包括子节点的子节点的存放路径的偏移地址、子节点的子节点的存放路径的长度、子节点的子节点的父节点的偏移地址、子节点的子节点的子节点偏移地址数组的偏移地址以及子节点的子节点的子节点个数。
59.作为本技术一个实施例,按照遍历顺序,依次向经步骤s102申请所得内存的第二剩余存储空间写入目标多叉树各节点的变长数据可以是:向第二剩余存储空间的首地址对应存储空间写入目标多叉树根节点的存放路径;若根节点存在子节点,则在写入目标多叉树根节点的存放路径之后,按照遍历顺序向第二剩余存储空间剩余的存储空间依次写入根节点各子节点的偏移地址;在写入根节点各子节点的偏移地址之后,按照遍历顺序向第二剩余存储空间剩余的存储空间依次写入各子节点的子节点的存放路径和偏移地址。图4给出了依次向内存的第二剩余存储空间写入图3示例的多叉树各节点的变长数据的示意图,其中也给出了各节点的定长数据中偏移数据的指向,换言之,多叉树信息虽然已经过序列化,但序列化后的数据中依然包含节点间的树形关系信息,原因也在于序列化后的数据中每个节点都保存了其父节点的偏移地址,每个节点都保存了自己所有子节点的偏移地址。
60.从上述图1示例的多叉树信息序列化方法可知,不同于相关技术在序列化多叉树信息时需要进行两次序列化操作,本技术的技术方案在获取目标多叉树的属性信息并申请与目标多叉树的属性信息相符的内存之后,依次向内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数以及按照遍历顺序向内存的剩余存储空间写入目标多叉树各节点自身数据,即本技术的技术方案仅仅只需要进行一次序列化操作
即可完成多叉树信息的序列化,因此具有序列化高效的优势。
61.相应于图1示例的多叉树信息序列化方法,本技术实施例提供了一种多叉树信息反序列化方法。参见图5,是本技术实施例示出的多叉树信息反序列化方法的流程示意图,该方法主要包括步骤s501至步骤s506,详细说明如下:
62.步骤s501:获取内存首地址,其中,内存为序列化目标多叉树各节点时申请的与目标多叉树的属性信息相符的内存,目标多叉树的属性信息包括目标多叉树各节点自身数据的长度、目标多叉树的总节点数以及目标多叉树各节点序列化后序列化结果所需缓存大小。
63.此处的内存为序列化目标多叉树各节点时申请的与目标多叉树的属性信息相符的内存。按照前述实施例对多叉树信息序列化方法的相关说明,内存中最先写入的数据是目标多叉树各节点序列化后序列化结果所需缓存大小即buffer_size,进一步地,buffer_size这一数据存储于第一预设存储空间,即为存储目标多叉树各节点序列化后序列化结果所需缓存大小预先分配的内存空间。因此,获取到第一预设存储空间的首地址也就获取到内存首地址。需要说明的是,由于内存中最先写入的数据是buffer_size,需要使用序列化结果的一方首先接收和解析出来的数据也是buffer_size。因此,需要使用序列化结果的一方可以通过接收和解析出来的buffer_size,将其与序列化结果预期的数据长度对比,若两者一致,则确定接收到的多叉树信息序列化结果是完整的数据,否则,确定数据不完整。
64.步骤s502:根据内存首地址、目标多叉树的总节点数预设存储空间以及目标多叉树各节点序列化后序列化结果所需缓存大小,计算目标多叉树的根节点地址。
65.由于在序列化多叉树信息时,是向内存写入目标多叉树各节点序列化后序列化结果所需缓存大小和目标多叉树的总节点数后,再向内存的剩余存储空间写入目标多叉树各节点自身数据,进一步地,在向内存的剩余存储空间写入目标多叉树各节点自身数据时,首先写入的是目标多叉树根节点的定长数据。因此,目标多叉树的根节点地址实际上为内存首地址、目标多叉树的总节点数预设存储空间以及目标多叉树各节点序列化后序列化结果所需缓存大小的预设存储空间三者之和。假设内存首地址记为buffer_addr,目标多叉树的根节点地址记为root_addr,目标多叉树的总节点数预设存储空间nc_buffer_size,则root_addr=buffer_addr buffer_size nc_buffer_size,例如,若buffer_size为4个字节(bytes),nc_buffer_size亦为4个字节(bytes),则root_addr=buffer_addr 8字节(bytes)。
66.步骤s503:根据目标多叉树的根节点地址和目标多叉树的根节点自身数据的长度,获取根节点各子节点地址,其中,根节点各子节点地址的获取顺序为序列化目标多叉树各节点时以预设遍历方式遍历目标多叉树各节点时的遍历顺序。
67.按照反序列化的定义或原理,反序列化的目标是要从序列化结果中解析出目标多叉树的各个节点地址、各个节点的父节点地址和子节点地址,从而按照这些地址,读取其自身数据,因此,在计算目标多叉树的根节点地址之后,根据目标多叉树的根节点地址和目标多叉树的根节点自身数据的长度,获取根节点各子节点地址。具体地,根据目标多叉树的根节点地址和目标多叉树的根节点自身数据的长度,获取根节点各子节点地址可以是:根据目标多叉树的根节点地址和根节点自身数据的长度,获取根节点子节点个数;根据目标多叉树的根节点地址,获取子节点偏移地址数组的首地址;根据子节点偏移地址数组的首地
址,计算根节点子节点中第n个子节点的地址。需要说明的是,虽然上述是以根节点为例,说明获取根节点各子节点地址的方法。然而,可以理解的是,上述获取根节点各子节点地址的方法同样适用于获取目标多叉树中其他非根节点各子节点地址,只需要将其中的根节点替换为非根节点即可,因此,此处不再赘述获取目标多叉树中其他非根节点各子节点地址的方法。
68.上述实施例中,根据目标多叉树的根节点地址和根节点自身数据的长度,获取根节点子节点个数具体为:计算根节点的定长数据的长度与根节点子节点个数所占存储空间之差;计算根节点地址与上述差之和作为存储根节点子节点个数的存储空间地址;从存储根节点子节点个数的存储空间地址对应的存储单元读取根节点子节点个数。此处,假设根节点的定长数据的长度与根节点子节点个数所占存储空间之差为33字节(bytes),则root_addr 33为存储根节点子节点个数的存储空间地址;若存储根节点子节点个数的存储空间为p个字节,则从root_addr 33开始的存储空间地址读取p个字节存储空间存储的内容即为根节点子节点个数child_count。
69.上述实施例中,根据目标多叉树的根节点地址,获取子节点偏移地址数组的首地址可以是:计算根节点定长数据中基础数据的长度与部分偏移数据所占存储空间之和;计算根节点地址与上述之和的和值作为子节点偏移地址数组的偏移地址的首地址;根据子节点偏移地址数组的偏移地址的首地址,获取子节点偏移地址数组的偏移地址;计算内存首地址与子节点偏移地址数组的偏移地址之和作为子节点偏移地址数组的首地址,其中,部分偏移数据包括根节点的存放路径的偏移地址、根节点的存放路径的长度以及父节点的偏移地址。例如,假设根节点定长数据中基础数据的长度与部分偏移数据所占存储空间之和为sr,根节点地址记为root_addr,则子节点偏移地址数组的偏移地址的首地址=root_addr sr。
70.上述实施例中,根据子节点偏移地址数组的首地址,计算根节点子节点个数中第n个子节点的地址可以是:定位至子节点偏移地址数组的首地址;从地址buffer_addr offset_child (n-1)*k开始,读取k个字节存储单元中的数据作为根节点子节点个数中第n个子节点的偏移地址(记为offset_child_node),将内存首地址与根节点子节点个数中第n个子节点的偏移地址之和作为根节点子节点个数中第n个子节点的地址,此处,k为offset_child_node在存储单元中占用的字节数,offset_child为子节点偏移地址数组的首地址,buffer_addr为内存首地址。
71.步骤s504:从根节点各子节点地址对应存储单元读取根节点各子节点的自身数据。
72.根节点各子节点的自身数据既包括各子节点的节点标识、父节点标识(pnid)、创建时间(create_time)、是否为活动态(is_active)、存放路径的偏移地址(offset_path)、存放路径的长度(path_len)、父节点的偏移地址(offset_parent_node)、子节点的偏移地址数组的偏移地址(offset_child_node)以及子节点个数(child_count)等在内存所占空间是固定的定长数据,又包括父节点或子节点的存放路径(path_data)和父节点或子节点的子节点偏移地址数组等在内存所占空间不固定的变长数据。
73.步骤s505:根据根节点各子节点的自身数据,获取根节点各子节点的父节点地址和子节点地址。
74.具体地,作为本技术一个实施例,根据根节点各子节点的自身数据,获取根节点各子节点的父节点地址和子节点地址可以是:根据根节点任意子节点的地址和根节点任意子节点自身数据的长度,获取任意子节点的子节点个数;根据根节点任意子节点的地址,获取根节点任意子节点的子节点偏移地址数组的首地址;根据根节点任意子节点的子节点偏移地址数组的首地址,计算任意子节点的子节点个数中第m个子节点的地址;计算根节点任意子节点中基础数据的长度、任意子节点自身数据存放路径的偏移地址所占存储空间、存放路径的数据长度所占存储空间以及根节点任意子节点的地址之和作为存放根节点任意子节点的父节点偏移地址的首地址;从该首地址读取出父节点偏移地址,将所述父节点偏移地址与内存首地址相加作为父节点地址。
75.步骤s506:从根节点各子节点的父节点地址和子节点地址对应存储单元读取根节点各子节点的父节点和子节点的自身数据。
76.根节点各子节点的父节点或子节点的自身数据包括该父节点或子节点的节点标识(nid)、该父节点或子节点的父节点标识(pnid)、该父节点或子节点的创建时间(create_time)、该父节点或子节点的是否为活动态(is_active)、存放路径的偏移地址(offset_path)、存放路径的长度(path_len)、父节点的偏移地址(offset_parent_node)、子节点偏移地址数组的偏移地址(offset_child_node)以及子节点个数(child_count)等在内存所占空间是固定的定长数据,还包括父节点或子节点的存放路径(path_data)和父节点或子节点的子节点偏移地址数组(child_offset)等在内存所占空间是不固定的变长数据。以父节点或子节点的节点标识(nid)和父节点标识(pnid)均占用4个字节的存储空间,创建时间(create_time)占用8个字节的存储空间,是否为活动态(is_active)占用1个字节的存储空间,存放路径的偏移地址(offset_path)、存放路径的长度(path_len)、父节点的偏移地址(offset_parent_node)、子节点的偏移地址数组的偏移地址(offset_child_node)以及子节点个数(child_count)均占用4个字节的存储空间为例,则从父节点地址或子节点地址(记为node_addr)开始读取4字节的数据即得到该父节点或子节点的节点标识(nid),从node_addr 4的地址开始读取4字节的数据即得到该父节点或子节点的父节点标识(pnid),从node_addr 8的地址开始读取8字节的数据即得到该父节点或子节点的创建时间(create_time),从node_addr 16的地址开始读取1字节的数据即得到该父节点或子节点是否为活动态(is_active)的数据,从node_addr 17的地址开始读取4字节的数据即得到该父节点或子节点存放路径的偏移地址(offset_path),从node_addr 21的地址开始读取4字节的数据即得到该父节点或子节点存放路径的长度(path_len),从该父节点或子节点存放路径的地址(buffer_addr offset_path)开始读取path_len个字节的数据即得到该父节点或子节点的存放路径(path_data)。
77.从上述图5示例的多叉树信息反序列化方法可知,不同于相关技术在序列化多叉树信息时需要进行两次反序列化操作,本技术的技术方案在获取内存首地址之后,根据内存首地址、目标多叉树的总节点数预设存储空间以及目标多叉树各节点序列化后序列化结果所需缓存大小,计算目标多叉树的根节点地址,根据目标多叉树的根节点地址和目标多叉树的各节点自身数据的长度,获取根节点各子节点地址,进而获取各节点的自身数据,即本技术的技术方案仅仅只需要进行一次反序列化操作即可完成反序列化,因此具有反序列化高效的优势。
programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
95.存储器810可以包括各种类型的存储单元,例如系统内存、只读存储器(rom)和永久存储装置。其中,rom可以存储处理器820或者计算机的其他模块需要的静态数据或者指令。永久存储装置可以是可读写的存储装置。永久存储装置可以是即使计算机断电后也不会失去存储的指令和数据的非易失性存储设备。在一些实施方式中,永久性存储装置采用大容量存储装置(例如磁或光盘、闪存)作为永久存储装置。另外一些实施方式中,永久性存储装置可以是可移除的存储设备(例如软盘、光驱)。系统内存可以是可读写存储设备或者易失性可读写存储设备,例如动态随机访问内存。系统内存可以存储一些或者所有处理器在运行时需要的指令和数据。此外,存储器810可以包括任意计算机可读存储媒介的组合,包括各种类型的半导体存储芯片(例如dram,sram,sdram,闪存,可编程只读存储器),磁盘和/或光盘也可以采用。在一些实施方式中,存储器810可以包括可读和/或写的可移除的存储设备,例如激光唱片(cd)、只读数字多功能光盘(例如dvd-rom,双层dvd-rom)、只读蓝光光盘、超密度光盘、闪存卡(例如sd卡、min sd卡、micro-sd卡等)、磁性软盘等。计算机可读存储媒介不包含载波和通过无线或有线传输的瞬间电子信号。
96.存储器810上存储有可执行代码,当可执行代码被处理器820处理时,可以使处理器820执行上文述及的方法中的部分或全部。
97.此外,根据本技术的方法还可以实现为一种计算机程序或计算机程序产品,该计算机程序或计算机程序产品包括用于执行本技术的上述方法中部分或全部步骤的计算机程序代码指令。
98.或者,本技术还可以实施为一种计算机可读存储介质(或非暂时性机器可读存储介质或机器可读存储介质),其上存储有可执行代码(或计算机程序或计算机指令代码),当可执行代码(或计算机程序或计算机指令代码)被电子设备(或服务器等)的处理器执行时,使处理器执行根据本技术的上述方法的各个步骤的部分或全部。
99.以上已经描述了本技术的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其他普通技术人员能理解本文披露的各实施例。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献