序列化方法和装置、以及反序列化方法和装置的制造方法_3

文档序号:9687264阅读:来源:国知局
S_START)设定为00000100,继承类结束状态标志(FLAG_STRUCTS_END)设定为00001000,非继承系成员类开始状态标志(FLAG_STRUCT_START)设定为00000001,非继承系成员类结束状态标志(FLAG_STRUCT_END)设定为00000010,继承系成员类开始状态标志可以设定为FLAG_STRUCTS_START|FLAG_STRUCT_START,即FLAG_STRUCTS_START与FLAG_STRUCT_START取或,得到的二进制序列为00000101。由于继承系成员类序列化时分开序列化其继承类及继承系成员类本身,因此可以以继承类结束状态标志(FLAG_STRUCTS_END)作为序列化其继承类结束时的标志,以成员类结束标志(FLAG_STRUCT_END)作为序列化继承系成员类本身结束时的标志,分别与继承系成员类开始状态标志中的FLAG_STRUCTS_START和FLAG_STRUCT_START对应。由于继承系成员类序列化在成员类本身序列化完毕后即结束,结束状态已经由成员类结束状态标志表示了,可以不必再输出继承系成员类结束状态标志,也可以输出继承系成员类结束状态标志来进一步表示继承系成员类序列化结束。继承系成员类结束状态标志,也可以为FLAG_STRUCTS_END与FLAG_STRUCT_END取或,相应的二进制序列为00001011。开始状态标志、结束状态标志和基础类状态标志也可以设定为其他的二进制序列。
[0072]在遍历数据对象中的每个类时:如果遍历到继承类,即遍历到的类为数据对象的继承类时,输出继承类开始状态标志,所述继承类的唯一类型序列和唯一标识,所述继承类的基础类状态标志,以及所述继承类中基础类型对应的字节序列,当继承类遍历完毕,输出继承类结束状态标志。需要说明的是,对数据对象的遍历开始时,首先遍历到的是数据对象本身,此时根据数据对象的声明或者类库的结构,判断数据对象是否具有继承类,当数据对象具有继承类时,将数据对象视为具有继承类的成员类,遍历数据对象的继承类进行序列化并输出,数据对象具有多层继承类时,逐层序列化并输出数据对象的继承类,然后序列化数据对象本身并输出;当时对象不具有继承类时,将数据对象视为不具有继承类的成员类,序列化数据对象本身并输出。也就是说,数据对象本身可视为不具有继承关系的成员类(数据对象不具有继承类时)或者具有继承关系的成员类(数据对象具有继承类时)来进行处理。
[0073]如果遍历到不具有继承类的成员类,即遍历到的类为数据对象中不具有继承类的成员类时,则输出成员类开始状态标志,所述成员类的唯一类型序列和唯一标识,所述成员类的基础类状态标志,以及所述成员类中基础类型对应的字节序列,当成员类遍历完毕,输出成员类结束状态标志。
[0074]如果遍历到具有继承类的成员类,即遍历到的类为数据对象中具有继承类的成员类时,则输出继承系成员类开始状态标志。由于对该成员类的继承类也需进行序列化,因此根据所述成员类的继承层次逐层输出所述成员类的继承类,所述成员类的继承类输出完毕,输出所述成员类。其中,输出所述成员类的继承类,与上述输出数据对象的继承类的方法类同,如果只有一层继承类,则输出所述继承类的唯一类型序列和唯一标识、所述继承类的基础类状态标志、所述继承类中基础类型对应的字节序列以及继承类结束状态标志,继承类结束状态标志用于标示当前继承类序列化完毕,由于已经输出继承系成员类开始状态标志,因此不必输出继承类开始状态标志,而只需以继承类结束状态标志来标示继承类序列化完毕。如果有多层继承类,则对每层继承类输出继承类开始状态标志,所述继承类的唯一类型序列和唯一标识、所述继承类的基础类状态标志、所述继承类中基础类型对应的字节序列以及继承类结束状态标志,此时使用完整的继承类开始状态标志和对应的继承类结束状态标志,用于区分不同层次的继承类。
[0075]输出所述成员类包括输出所述成员类的唯一类型序列和唯一标识,所述成员类的基础类状态标志,以及所述成员类中基础类型对应的字节序列,当具有继承类的成员类遍历完毕,输出继承系成员类结束状态标志,由于成员类只有单层,且已经输出继承系成员类开始状态标志,因此不必输出成员类开始状态标志,而只需以成员类结束状态标志来标示成员类序列化完毕,输出成员类结束状态标志后,对于具有继承类的成员类的输出已经完毕,可以不用输出继承系成员类结束标志,也可以在成员类结束状态标志之后输出继承系成员类结束标志,更明确地标示具有继承类的成员类输出完毕,但会增加整体序列的数据量。
[0076]下面用本申请的一个应用案例进一步说明本申请,以使本领域技术人员更好地理解本申请的原理和应用。例如,一个数据对象SerialLTest,继承Parent类,包含一个不具有继承类的成员类Contain。Parent类具有int类型(属于基础类型)的成员parentVers1n,其值为10 ;SerialLTest具有int类型的成员vers1n,其值为66 ;Contain具有int类型的成员containVers1n,其值为11。使用本申请实施例所述方法进行序列化,其中,开始状态标志、基础类状态标志及结束状态标志为8bit,与类对应的唯一类型序列32bit,类中成员的标识和基础类型成员的标识皆为16bit,基础类型对应的唯一类型序列24bit,基础类型成员的值序列的长度由为值转换为二进制的实际长度。基础状态标志(FLAG_VALUE)设定为00000000 ( 二进制,以下进制相同),继承类开始状态标志(FLAG_STRUCTS_START)设定为 00000100,继承类结束状态标志(FLAG_STRUCTS_END)设定为00001000,非继承系成员类开始状态标志(FLAG_STRUCT_START)设定为00000001,非继承系成员类结束状态标志(FLAG_STRUCT_END)设定为00000010,继承系成员类开始状态标志设定为 FLAG_STRUCTS_START|FLAG_STRUCT_START,即 FLAG_STRUCTS_START 与 FLAG_STRUCT_START取或,得到的二进制序列为00000101,继承系成员类结束状态标志,设定为FLAG_STRUCTS_END 与 FLAG_STRUCT_END 取或,即 00001011。
[0077]序列化的结果(十六进制)如下:
[0078]05 01 OF F5 2E 00 00 00 00 00 01 00 01 00 00 00
[0079]OA 02 01 02 23 79 2A 00 00 00 00 00 01 00 01 00
[0080]00 00 42 01 01 EF BD 18 00 02 00 00 00 01 00 01
[0081]00 00 00 OB 02 OA
[0082]其中:
[0083]05:遍历SerialLTest对象,其具有继承类Parent,输出继承系成员类开始状态标志(FLAG_STRUCTS_START | FLAG_STRUCT_START),即 05 ;
[0084]01 OF F5 2E:类 Parent 的唯一类型序列;
[0085]00 00:Parent 的第一个成员类;
[0086]00:FLAG_VALUE,基础类状态标志;
[0087]00 00 01:1nt 基础类型;
[0088]00 01:parentVers1n的标识,作为基础类型成员在Parent里的次序;
[0089]00 00 00 OA:parentVers1n 的值,是 10 (十进制);
[0090]02:FLAG_STRUCT_END,表示 Parent 结束;
[0091]01:继续遍历,回到数据对象本身SerialTest,输出成员类开始状态标志FLAG_STRUCT_START ;
[0092]02 23 79 2A:类 SeriallTest 的唯一类型序列;
[0093]00 00:SerialTest 中成员类的标识;
[0094]00: FLAG_VALUE,基础类状态标志;
[0095]00 00 01:1nt 基础类型;
[0096]00 01:基础类型成员vers1n在SeriallTest里的标识;
[0097]00 00 0042:vers1n 值,是 66 (十进制);
[0098]01:遍历SerialTest的成员类Contain, Contain为不具有继承类的成员类,输出成员类开始状态标志FLAG_STRUCT_START ;
[0099]01 EF BD 18:Contain 的唯一类型序列;
[0100]00 02:Contain 的标识;
[0101 ] 00:FLAG_VALUE,基础类状态标志;
[0102]00 00 01:1nt 基础类型;
[0103]00 01:containVers1n 的标识;
[0104]00 00 00 OB:containVers1n 的值是 11 (十进制);
[0105]02:成员类结束标志FLAG_STRUCT_END,表示类Contain结束;
[0106]OA:继承系成员类结束状态标志,FLAG_STRUCTS_END | FLAG_STRUCT_END,表示SerialTest类结束。数据对象序列化完毕。
[0107]与本应用案例的结果对比,使用常规的Java序列化上述同一个对象,得到的序列化结果(十六进制)如下:
[0108]AC ED 00 05 73 72 00 OA 53 65 72 69 61 6C 54 65
[0109]73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
[0110]76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
[0111]4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
[0112]65 6E 74 OE DB D2 BD 85 EE 63 7A 02 00 01 49 00
[0113]OD 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
[0114]00 00 00 OA 00 00 00 42 73 72 00 07 63 6F 6E 74
[0115]61 69 6E FC BB E6 OE FB CB 60 C7 02 00 01 49 00
[0116]OE 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
[0117]70 00 00 00 OB
[0118]由于Java序列化结果繁琐冗长,故不一一注释。由此可见,本申请实施例所提供的序列化方法,所得的序列化结果具有
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1