一种键值对集合类型的二进制序列化方法及系统与流程

文档序号:28267175发布日期:2021-12-31 18:49阅读:138来源:国知局
一种键值对集合类型的二进制序列化方法及系统与流程

1.本发明涉及计算机应用程序对象序列化技术领域,具体而言,涉及一种键值对集合类型的二进制序列化方法及系统。


背景技术:

2.在一些数据存储系统中,通常会将数据对象以json格式或者xml格式来进行存储,修改和读取时都要以整个目标对象为单位来进行数据的序列化和反序列化操作。目前常用的序列化方案是将目标对象以json格式进行序列化存储,当仅修改对象中的某个属性时需要重新完整的将目标对象序列化成json数据,当仅读取对象的某个属性时需要完整的将json数据反序列化成对象然后再读取目标属性。
3.现有技术的缺陷和不足:
4.现在的大多数序列化技术都因为协议的设计而只能对一个对象进行完整的反序列化,如果只想读取对象中的某个元素,需要完全的序列化或反序列化。
5.有的json存储数据中往往包含大量无用数据,如果只想读取json存储数据的某个字段,则必须先将整个json数据进行反序列化,这样会增加无用的反序列化开销。
6.按需反序列化某一个字段的实现通常是在应用层面来实现,如常见互联网序列化协议protobuf、mesagepack的java和.net语言框架实现都是在应用程序中为被序列化对象定义索引下标,通过在应用程序中进行约定的方式来实现仅反序列化某一个字段的功能,这种功能是应用程序实现来赋能的,而不是协议或算法本身支持,因此不具备通用性和便捷性。


技术实现要素:

7.本发明的目的在于提供一种键值对集合类型的二进制序列化方法,其能够将应用程序对象完整的序列化和反序列化,还可以直接反序列化应用程序对象中的某个字段,且不需要在应用层面为目标应用程序对象进行任何约定。
8.本发明的另一目的在于提供一种键值对集合类型的二进制序列化系统,其能够运行一种键值对集合类型的二进制序列化方法。
9.本发明的实施例是这样实现的:
10.第一方面,本技术实施例提供一种键值对集合类型的二进制序列化方法,其包括键值对集合对象的序列化:s110,将键值对集合通过预设算法将字符串转成字节数组,并对字节数组以固定字节切割成字节数组集合,得到tuple数组;s120,将tuple数组中的每个元素都转成entry,得到entry数组;s130,对entry数组中value为tuple的部分进行不断的分组、排序,生成group数组;s140,对group数组进行序列化,往流中写入用来快速定位键值对键的路由段和用来存储键值对数据的数据段。
11.在本发明的一些实施例中,上述将键值对集合通过预设算法将字符串转成字节数组,并对字节数组以固定字节切割成字节数组集合,得到tuple数组包括:s111,将键值对集
合通过utf8算法将字符串转成字节数组,并对字节数组以8个字节切割成字节数组集合,最终得到tuple数组。
12.在本发明的一些实施例中,上述还包括键值对集合对象反序列化:s200,从流中读取路由段,根据路由段得出字节数组集合和值在数据段中的位置;s210,对字节数组集合通过utf8算法转换成字符串,从数据段中的指定位置读取值,得到一个键值对。
13.在本发明的一些实施例中,上述还包括:s220,若流中仍有元素可以读取,则重复s200及s210,直至流中再无元素可以读取。
14.在本发明的一些实施例中,上述包括不用完全反序列化从字节数组中获取键值对集合对象中的任意一个键值:s300,从流中读取路由段,通过键值对集合对象给定的键在路由段中查找值在数据段中的偏移量;s310,根据值偏移量在数据段中读取值。
15.第二方面,本技术实施例提供一种键值对集合类型的二进制序列化系统,其包括键值对集合对象的序列化模块,将键值对集合应用程序对象序列化成字节数组;键值对集合对象反序列化模块,将字节数组反序列化成键值对集合应用程序对象;不用完全反序列化模块,用于从字节数组中获取键值对集合对象中的任意一个键值模块。
16.在本发明的一些实施例中,上述键值对集合对象的序列化模块包括:切割子模块,用于将键值对集合通过预设算法将字符串转成字节数组,并对字节数组以固定字节切割成字节数组集合,得到tuple数组;第一转换子模块,用于将tuple数组中的每个元素都转成entry,得到entry数组;生成子模块,用于对entry数组中value为tuple的部分进行不断的分组、排序,生成group数组;存储子模块,用于对group数组进行序列化,往流中写入用来快速定位键值对键的路由段和用来存储键值对数据的数据段。
17.在本发明的一些实施例中,上述键值对集合对象反序列化模块包括:定位子模块,用于从流中读取路由段,根据路由段得出字节数组集合和值在数据段中的位置;第二转换子模块,用于对字节数组集合通过utf8算法转换成字符串,从数据段中的指定位置读取值,得到一个键值对;循环子模块,若流中仍有元素可以读取,则重复定位子模块及第二转换子模块,直至流中再无元素可以读取。
18.在本发明的一些实施例中,上述不用完全反序列化模块包括:查找子模块,用于从流中读取路由段,通过键值对集合对象给定的键在路由段中查找值在数据段中的偏移量;读取子模块,用于根据值偏移量在数据段中读取值。
19.第三方面,本技术实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如一种键值对集合类型的二进制序列化方法中任一项的方法。
20.相对于现有技术,本发明的实施例至少具有如下优点或有益效果:
21.可以将应用程序对象完整的序列化和反序列化,还可以直接反序列化应用程序对象中的某个字段,且不需要在应用层面为目标应用程序对象进行任何约定。读取存储数据中的某一个字段时,无需将整个对象进行反序列化读取,没有多余的反序列化开销;不需要在应用程序层面为被序列化对象进行任何约定,即可直接读取存储数据中的某一个字段。
附图说明
22.为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附
图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
23.图1为本发明实施例提供的一种键值对集合对象的序列化方法步骤示意图;
24.图2为本发明实施例提供的键值对集合对象序列化流程图;
25.图3为本发明实施例提供的键值对集合对象处理为group数组流程图;
26.图4为本发明实施例提供的键值对集合序列化格式图;
27.图5为本发明实施例提供的一种键值对集合对象反序列化方法步骤示意图;
28.图6为本发明实施例提供的从流中反序列化键值对集合对象流程图;
29.图7为本发明实施例提供的从流中读取键值对集合对象单个键值流程图;
30.图8为本发明实施例提供的一种不用完全反序列化就可以从字节数组中获取键值对集合对象中的某个键值的方法步骤示意图;
31.图9为本发明实施例提供的一种电子设备。
32.图标:101

存储器;102

处理器;103

通信接口。
具体实施方式
33.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本技术实施例的组件可以以各种不同的配置来布置和设计。
34.因此,以下对在附图中提供的本技术的实施例的详细描述并非旨在限制要求保护的本技术的范围,而是仅仅表示本技术的选定实施例。基于本技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
35.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
36.需要说明的是,术语“包括”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
37.下面结合附图,对本技术的一些实施方式作详细说明。在不冲突的情况下,下述的各个实施例及实施例中的各个特征可以相互组合。
38.实施例1
39.为了帮助本实施进行完整描述,特定义了如下类型:
40.1.枚举类型bsmaproutetoken,包含8个枚举,分别是equalnext、equalnextn、equallast、equallastn、lesthen、leselse、haschildren、nochildren。
41.2.枚举类型automatestate,包含4个枚举,分别是readbranch、readkey、readchildren、checkend。
42.3.枚举类型automatereadonekeystate,包含2个枚举,分别是readnextbranch、readchildren。
43.4.类型valueinfo,包含两个字段valueoffsetinroutedataposition和value,valueoffsetinroutedataposition是整数类型,value是object类型。
44.请参阅图1、图2、图3、图4,图1为本发明实施例提供的一种键值对集合类型的二进制序列化方法步骤示意图,其如下所示:
45.s110,将键值对集合通过预设算法将字符串转成字节数组,并对字节数组以固定字节切割成字节数组集合,得到tuple数组;
46.在一些实施方式中,将键值对集合通过utf8算法将字符串转成字节数组,并对字节数组以8个字节切割成字节数组集合,最终得到tuple数组s120,将tuple数组中的每个元素都转成entry,得到entry数组;
47.s130,对entry数组中value为tuple的部分进行不断的分组、排序,生成group数组;
48.s140,对group数组进行序列化,往流中写入用来快速定位键值对键的路由段和用来存储键值对数据的数据段。
49.在一些实施方式中,往流中写入一个代表键值对集合对象中的元素数量的整数,若元素数量为0则序列化完成,否则执行以下步骤:
50.s2,定义一个方法method_converttoentries,method_converttoentries接收一个键值对集合对象arg1,返回entry数组对象,方法有如下步骤:
51.s2.1,创建一个entry数组对象;
52.s2.2,遍历键值对集合对象arg1,在遍历中获取键值对对象并执行如下操作;
53.s2.2.1,将键值对的键通过utf8编码转成字节数组;
54.s2.2.2,对字节数组以8个字节为单位切割,最终形成字节数组集合;
55.s2.2.3,创建一个tuple对象,并将字节数组集合赋值于tuple的key,将值赋值给tuple的value;
56.s2.2.4,创建一个entry类型对象,将tuple对象赋值给entry的value,将entry对象添加到entry数组中;
57.s2.3,返回entry数组对象;
58.s3,定义一个方法method_handletogroups,method_handletogroups接收一个entry数组对象arg1,返回group数组对象,方法有如下步骤:
59.s3.1,获取entry数组对象arg1中value为tuple类型的entry部分,对tuple对象的key作为分组标识进行分组得到group数组对象a1,其中分组标识是group对象中的key,分组内的entry元素部分是group对象中的value;
60.s3.2,对a1以key为排序标识进行排序;
61.s3.3,将a1中每个group对象的value中的每个tuple的key字节数组集合移除第一段字节数组;
62.s3.4,遍历a1,在遍历中获取group对象item并执行如下操作:
63.s3.4.1,获取item中tuple的第一个元素字节数组集合长度大于0的entry部分,并在item中将这部分进行移除;
64.s3.4.2,若被移除的这部分entry数目大于0,则将这部分entry重新组合成entry数组执行method_handletogroups方法,得到group数组对象a2;
65.s3.4.3,遍历group数组对象a2,对a2内的每个group都创建一个entry类型对象,entry对象的value为group,然后将enrty对象添加至item的value中;
66.s3.5,返回a1;
67.s4,定义一个方法method_writebacknextbranchoff,method_writebacknextbranchoff方法接收一个流类型对象arg1、一个整数类型对象arg2(基础偏移量)、一个整数类型对象arg3(值),方法无返回值,方法有如下步骤:
68.s4.1,创建一个整数类型对象local1,值为流类型对象arg1在缓冲区中的当前位置;
69.s4.2,创建一个整数类型对象local2,值为local1减去arg2;
70.s4.3,将流类型对象arg1在缓冲区的位置设置为arg3的值,并写入一个整数arg2;
71.s4.4,将流类型对象arg1在缓冲区的位置设置为local1的值;
72.s5,定义一个方法method_fillnextbranchoff,method_fillnextbranchoff方法接收一个流类型对象arg1、一个整数类型对象arg2(基础偏移量),返回一个整数对象,方法有如下步骤:
73.s5.1,创建一个整数类型对象local1,值为流类型对象arg1在缓冲区中的当前位置减去arg2的值;
74.s5.2,往流类型对象arg1中写入一个整数0;
75.s5.3,返回整数对象local1;
76.s6,定义一个方法method_writeroutedata,method_writeroutedata接收一个group数组对象arg1、一个valueinfo类型队列对象arg2、一个流类型对象arg3和一个整数类型对象arg4,方法无返回值,方法有如下步骤:
77.s6.1,定义一个整数类型对象nextnextbranchpos,默认值为0;
78.s6.2,如果group数组对象arg1的元素数量小于4,则对arg1进行遍历,在遍历中获取group对象item并执行s6.2.1、s6.2.2、s6.2.3、s6.2.4,否则执行s6.2.5、s6.2.6、s6.2.7、s6.2.8、s6.2.9、s6.2.10、s6.2.11、s6.2.12、s6.2.13步骤:
79.s6.2.1.a,若group对象item不是group数组对象arg1中的第一个元素,则将对象arg3、arg4、nextnextbranchpos带入方法method_writebacknextbranchoff中执行;
80.s6.2.2.b,若group对象item不是group数组对象arg1中的最后一个元素,则执行s6.2.2.1、s6.2.2.2步骤,否则执行s6.2.2.3步骤:
81.s6.2.2.1,若group对象item的value中存在entry的value是tuple类型的entry对象,则往流对象arg3中写入一个枚举equalnext,否则写入一个枚举equalnextn;
82.s6.2.2.2,将arg3和arg4带入到method_fillnextbranchoff中,method_fillnextbranchoff方法执行得到的值赋值给nextnextbranchpos;
83.s6.2.2.3,若group对象item的value中存在entry的value是tuple类型的entry对象,则往流对象arg3中写入一个枚举equallast,否则写入一个枚举equallastn;
84.s6.2.3,若group对象item的value中存在entry的value是tuple类型的entry对象,则执行s6.2.3.1、s6.2.3.2、s6.2.3.3、s6.2.3.4步骤,否则执行s6.2.3.5步骤:
85.s6.2.3.1,往流类型对象arg3中写入group对象item的key;
86.s6.2.3.2,创建一个整数类型对象local1,值为流类型对象arg3在缓冲区中的当前位置减去arg4的值;
87.s6.2.3.3,往流类型对象arg3中写入一个整数0;
88.s6.2.3.4,创建一个valueinfo类型对象,将local1赋值给valueinfo的valueoffsetinroutedataposition对象,将entry的value是tuple类型的entry对象的value赋值给valueinfo的value,然后将valueinfo对象往arg2中入队;
89.s6.2.3.5,往流类型对象arg3中写入group对象item的key;
90.s6.2.4,若group对象item的value中包含entry的value是group类型的entry对象,则执行s6.2.4.1、s6.2.4.2步骤,否则执行s6.2.4.3步骤:
91.s6.2.4.1,若group对象item的value中存在entry的value是tuple类型的entry对象,则往流类型对象arg3中写入一个枚举haschildren;
92.s6.2.4.2,将group对象item的value中entry的value是group类型的entry对象部分、arg2、arg3、arg4带入方法method_writeroutedata中执行;
93.s6.2.4.3,往流类型对象arg3中写入一个枚举nochildren;
94.s6.2.5,定义一个group类型对象m1,值为位于group数组对象arg1的中间位置的group对象;
95.s6.2.6,往流对象arg3中写入一个枚举lesthen;
96.s6.2.7,定义一个整数类型对象local2,将arg3和arg4带入到method_fillnextbranchoff中,method_fillnextbranchoff方法执行得到的值赋值给local2;
97.s6.2.8,往流类型对象arg3中写入group对象item的key;
98.s6.2.9,定义一个group数组对象group1和一个group数组对象group2,,将group数组对象arg1从中间位置切割成两半数组,第一半数组赋值为group1,第二半数组赋值为group2;
99.s6.2.10,将group1、arg2、arg3、arg4带入方法method_writeroutedata中执行;
100.s6.2.11,将arg3、arg4、local2带入方法method_writebacknextbranchoff中执行;
101.s6.2.12,往流对象arg3中写入一个枚举leselse;
102.s6.2.13,将group2、arg2、arg3、arg4带入方法method_writeroutedata中执行;
103.s7,将键值对集合带入method_converttoentries方法中,最终得到entry数组对象e1;
104.s8,将entry数组对象e1带入method_handletogroups方法中,最终得到group数组对象g1;
105.s9,定义一个整数类型对象pos,将流当前的位置赋值给pos;
106.s10,创建一个valueinfo类型队列对象vals,将g1、vals、流对象、pos带入method_writeroutedata中执行;
107.s11,定义一个方法method_writevalues,method_writevalues接收一个valueinfo类型队列对象arg1、一个流类型对象arg2,方法无返回值,方法有如下步骤:
108.s11.1,若valueinfo类型队列对象arg2的元素数量大于0,则执行如下步骤;
109.s11.1.1,定义一个整数类型对象cpos,然后将流类型对象arg2流当前的位置赋值给cpos;
110.s11.1.2,定义一个valueinfo类型对象val,然后对arg2出队,将出队的对象赋值给val;
111.s11.1.3,在流类型对象arg2的val对象的valueoffsetinroutedataposition位置处写入整数值cpos;
112.s11.1.4,在流类型对象arg2的cpos位置处写入val对象的value元素;
113.s11.1.5,重新执行s11.1步骤;
114.s12,将vals、流对象带入到method_writevalues中执行。
115.实施例2
116.请参阅图5、图6、图7,图5为本发明实施例提供的一种键值对集合类型的二进制序列化方法详细步骤示意图,其如下所示:
117.s200,从流中读取路由段,根据路由段得出字节数组集合和值在数据段中的位置;
118.s210,对字节数组集合通过utf8算法转换成字符串,从数据段中的指定位置读取值,得到一个键值对。
119.s220,若流中仍有元素可以读取,则重复s200及s210,直至流中再无元素可以读取。
120.在一些实施方式中,反序列化具体实施如下
121.s1,创建一个键值对集合对象dict,从流中读取一个整数类型对象count,若count的值为0,则反序列化完成,返回dict,否则执行如下步骤
122.s2,定义一个整数类型对象basepos,值为流对象游标在流中当前的位置
123.s3,定义一个方法method_autoreadkeyvaluepair,方法接收一个automatestate枚举类型对象arg1,流类型对象arg2,字节数组集合对象arg3,bsmaproutetoken枚举类型栈对象arg4,键值对集合对象arg5,方法无返回值,方法有如下步骤:s3.1,定义一个bsmaproutetoken枚举类型对象token;s3.2,若arg1是readbranch,则执行如下步骤,否则执行s3.3步骤;s3.2.1,从流对象arg2中读取一个bsmaproutetoken枚举,并将其赋值给token;s3.2.2,对arg4对象将token入栈;s3.2.3,如果token是equalnext,则执行如下步骤,否则执行s3.2.4;s3.2.3.1,从流对象arg2中读取一个整数;s3.2.3.2,将arg1的值赋值为readkey,然后重新执行s3.2步骤;s3.2.4,如果token是equallast,则将arg1的值赋值为readkey,然后重新执行s3.2步骤,否则执行s3.2.5;s3.2.5,如果token是equalnextn,则执行如下步骤,否则执行s3.2.6;s3.2.5.1,从流对象arg2中读取一个整数;s3.2.5.2,从流对象arg2中读取一个字节数组,然添加至arg3数组集合中;s3.2.5.3,将arg1的值赋值为readbranch,然后重新执行s3.2步骤;s3.2.6,如果token是equallastn,则执行如下步骤,否则执行s3.2.7;s3.2.6.1,从流对象arg2中读取一个字节数组,然添加至arg3数组集合中;s3.2.6.2,将arg1的值赋值为readbranch,然后重新执行s3.2步骤;s3.2.7,如果token是lesthen,则执行如下步骤,否则执行s3.2.8;s3.2.7.1,从流对象arg2中读取一个整数;s3.2.7.2,从流对象arg2中读取一个字节数组;s3.2.7.3,将arg1的值赋值为readbranch,然后重新执行3.2步骤s3.2.8,将arg1的值赋值为readbranch,然后重新执行s3.2步骤;s3.3,若arg1是readkey,则执行如下步骤,否则执行s3.4;s3.3.1,从流对象arg2中读取一
个字节数组,然添加至arg3字节数组集合中;s3.3.2,定义一个字节数组对象byte1,将arg3字节数组集合中的字节数组元素全都拼接成一个字节数组对象,然后将值赋给byte1;s3.3.3,定义一个字符串对象key,将字节数组byte1通过utf8算法转成字符串对象,然后将值赋给key;s3.3.4,定义一个整数类型对象valoffset,值为从流对象arg2中读取的一个整数;s3.3.5,定义一个整数类型对象curpos,值为流对象arg2游标在流中当前的位置;s3.3.6,定义一个整数类型对象result,值为basepos和curpos相加的结果,将流对象arg2游标设置为result的值;s3.3.7,定义一个值类型对象value,值为从流对象arg2中读取的一个value;s3.3.8,往键值对集合对象arg5中添加一个键值对,键为key,值为value;s3.3.9,将count进行减一,并将结果赋值给count;s3.3.10,将arg1的值赋值为readchildren,然后重新执行s3.2步骤s3.4,若arg1是readchildren,则执行如下步骤,否则执行s3.5;s3.4.1,从流对象arg2中读取一个bsmaproutetoken枚举,并将其赋值给token;s3.4.2,如果token是haschildren,则将arg1的值赋值为readbranch,然后重新执行s3.2步骤,否则执行s3.4.3步骤;s3.4.3,如果token是nochildren,则执行如下步骤:s3.4.3.1.获取bsmaproutetoken枚举类型栈对象arg4中位于栈顶的一个枚举而不删除它,然后将枚举赋给token;s3.4.3.2.如果token是equalnext或equalnextn,则执行如下步骤,否则执行s3.4.3.3步骤;s3.4.3.2.1,对arg4弹出位于栈顶的对象;s3.4.3.2.2,移除位于arg3的末尾元素;s3.4.3.2.3,将arg1的值赋值为readbranch,然后重新执行s3.2步骤;s3.4.3.3,如果token是equallast或equallastn,则执行如下步骤,否则执行s3.4.3.4步骤;s3.4.3.3.1,对arg4弹出位于栈顶的对象;s3.4.3.3.2,移除位于arg3的末尾元素;s3.4.3.3.3,如果arg4的元素数量大于0,则重新执行s3.4.3.1步骤,否则将arg1的值赋值为checkend,然后重新执行s3.2步骤;s3.4.3.4,如果token是lesthen,则对arg4弹出位于栈顶的对象,然后将arg1的值赋值为readbranch,然后重新执行s3.2步骤,否则执行s3.4.3.5步骤;s3.4.3.5,如果token是leselse,对arg4弹出位于栈顶的对象,如果arg4的元素数量大于0,则重新执行s3.4.3.1步骤,否则将arg1的值赋值为checkend,然后重新执行s3.2步骤;s3.5,若arg1是checkend,则判断count是否为0,如果不为0,则将arg1设置为readbranch,然后重新执行s3.2步骤;
124.s4,创建一个automatestate枚举类型对象para1,值为readbranch,创建一个字节数组集合对象para2,创建一个bsmaproutetoken枚举类型栈对象para3,将para1、流对象、para2、para3、dict带入到method_autoreadkeyvaluepair中执行;
125.s5,返回dict对象。
126.在一些实施方式中,反序列化单个字段具体实施如下
127.s1.定义一个bsmaproutetoken枚举类型对象token,值为default、一个整数类型对象keypos,值为0、一个automatereadonekeystate枚举类型对象state,值为readnextbranch、一个字节数组集合对象key、一个整数类型对象basepos,值为流当前的位置;
128.s2.从流中读取一个整数,若该整数值为0,则方法返回空,结束本方法;
129.s3.将字符串对象str通过utf8算法转换成字节数组,并将字节数组以8个字节为单位进行切割成字节数组集合,然后将字节数组集合赋值给key;
130.s4.若state是readnextbranch,则执行如下步骤,否则执行s5步骤;s4.1,从流中
读取一个bsmaproutetoken枚举,并将其赋值给token;s4.2,如果token是lesthen,则执行如下步骤,否则执行s4.3;s4.2.1,定义一个整数类型对象nextoff,值为从流中读取的一个整数。定义一个字节数组类型对象value1,值为从流中读取的一个字节数组;s4.2.2,如果字节数组集合key在keypos下标处位置的值大于value1,则执行如下步骤:s4.2.2.1,将nextoff和basepos进行相加得到值mid,将流的游标设置为mid;s4.2.2.2,从流中读取一个bsmaproutetoken枚举;s4.2.3,从流中读取一个bsmaproutetoken枚举,并将其赋值给token,然后执行s4.2;s4.3,如果token是equalnext或equalnextn,则执行如下步骤,否则执行s4.4;s4.3.1,定义一个整数类型对象nextoff,值为从流中读取的一个整数。定义一个字节数组类型对象value1,值为从流中读取的一个字节数组。定义一个字节数组类型对象keyvalue,值为字节数组集合key在keypos下标处的值;s4.3.2,如果keyvalue大于value1,则执行如下步骤,否则执行s4.3.3;s4.3.2.1,将nextoff和basepos进行相加得到值mid,将流的游标设置为mid;s4.3.2.2,从流中读取一个bsmaproutetoken枚举,并将值赋值给token;s4.3.3,如果keyvalue等于value1,则执行如下步骤,否则执行s4.3.4;s4.3.3.1,如果keypos不等于字节数组集合对象key的元素数量减一,则执行如下步骤,否则执行s4.3.3.2;s4.3.3.1.1,将keypos加一,并将值赋给keypos;s4.3.3.1.2,如果token不等于equalnextn,则往流中读取一个整数,然后将state设置为readchildren,重新执行s4步骤;s4.3.3.1.3,将state设置为readnextbranch,重新执行s4步骤;s4.3.3.2,如果token等于equalnextn,则返回空,方法结束;s4.3.3.3,往流中读取一个整数,并将值赋给nextoff,将nextoff和basepos进行相加得到值mid,将流的游标设置为mid,从流中读取一个value并返回,方法结束;s4.3.4,返回空,方法结束;s4.4,如果token是equallast或equallastn,则执行如下步骤:s4.4.1,定义一个字节数组类型对象value1,值为从流中读取的一个字节数组;s4.4.2,如果字节数组集合key在keypos下标处位置的值等于value1,则执行如下步骤,否则返回空,方法结束;s4.4.2.1,如果keypos不等于字节数组集合对象key的元素数量减一,则执行如下步骤,否则执行s4.4.2.2;s4.4.2.1.1,将keypos加一,并将值赋给keypos;s4.4.2.1.2,如果token不等于equallastn,则往流中读取一个整数,然后将state设置为readchildren,重新执行4步骤;s4.4.2.1.3,将state设置为readnextbranch,重新执行s4步骤;s4.4.2.2,如果token等于equallastn,则返回空,方法结束;s4.4.2.3,往流中读取一个整数,并将值赋给nextoff,将nextoff和basepos进行相加得到值mid,将流的游标设置为mid,从流中读取一个value并返回,方法结束;
131.s5,如果state是readchildren,则执行如下步骤:s5.1,从流中读取一个bsmaproutetoken枚举,并将其赋值给token;s5.2,如果token是haschildren,则将state设置为readnextbranch,重新执行s4步骤s5.3,返回空,方法结束;
132.s6,返回空,方法结束。
133.实施例3
134.请参阅图8,图8为本发明实施例提供的一种不用完全反序列化就可以从字节数组中获取键值对集合对象中的某个键值的方法步骤示意图,其如下所示:
135.s300,从流中读取路由段,通过键值对集合对象给定的键在路由段中查找值在数据段中的偏移量;
136.s310,根据值偏移量在数据段中读取值。
acces memory)、磁碟或者光盘等各种可以存储程序代码的介质。
144.综上所述,本技术实施例提供的一种键值对集合类型的二进制序列化方法及系统,可以将应用程序对象完整的序列化和反序列化,还可以直接反序列化应用程序对象中的某个字段,且不需要在应用层面为目标应用程序对象进行任何约定。读取存储数据中的某一个字段时,无需将整个对象进行反序列化读取,没有多余的反序列化开销;不需要在应用程序层面为被序列化对象进行任何约定,即可直接读取存储数据中的某一个字段。
145.以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
146.对于本领域技术人员而言,显然本技术不限于上述示范性实施例的细节,而且在不背离本技术的精神或基本特征的情况下,能够以其它的具体形式实现本技术。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本技术的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本技术内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1