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

文档序号:9687264阅读:来源:国知局
完整的继承性,而且数据量大大减少,而且序列化过程得到简化,使序列化更为高效。
[0119]相应于本申请的第一方面,在本申请的第二方面,提供一种反序列化方法。需要说明的是,反序列化方法与序列化方法是相应的,反序列化方法通过事先建立的协议,遵照协议针对序列化得到的字节流反序列化。所述协议包括字节流的结构、字节序列的含义、转换的方式等。本申请实施例中,所述协议包括与预设的开始状态标志、基础类状态标志、结束状态标志的长度和含义,类的唯一类型序列的长度和构成,类中成员类的标识的长度和对应的成员类,预设的基础类型对应的唯一类型序列长度和对应的基础类型,基础类型成员的标识的长度和对应的基础类型,以及上述各个标志、类型序列、标识在字节流中排列的顺序(字节流的结构)等,以上所述长度为字节或序列的长度。本申请实施例反序列化和序列化协议的制订与常规的反序列化和序列化协议的制订方法相同。
[0120]本申请实施例提供的反序列化方法依据制订的协议对序列化生成的字节流进行反序列化。其中,预设的开始状态标志、基础类状态标志、结束状态标志,类的唯一类型序列,类中成员类的标识,预设的基础类型对应的唯一类型序列,基础类型成员的标识,以及基础类型成员的值序列,与本申请第一方面提供的序列化方法中的概念相同,不再赘述。
[0121]图2为本申请一示例性实施例示出的一种反序列化方法的流程示意图,如图2所示,所述方法包括:
[0122]在步骤S201中,依次读取字节流。
[0123]在步骤S202中,读取到与类对应的开始状态标志时,依次读取字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识。
[0124]所述类包括继承类、具有继承类的成员类和不具有继承类的成员类。序列化所得字节流的最前规定长度的字节即类对应的开始状态标志,所述规定长度为序列化时类对应的开始状态标志的长度,例如,若序列化中类对应开始状态标志的规定长度为8bit,则序列化所得字节流的首Sbit即类的对应开始状态标志,因此读取字节流的首8bit,得到类对应开始状态标志。读取到继承类对应的开始状态标志,即继承类开始状态标志时,开始继承类的构建;读取到非继承系成员类开始状态标志时,开始不具有继承类的成员类的构建;读取到继承系成员类开始状态标志时,开始具有继承类的成员类的构建,对于具有继承类的成员类的构建,先构建所述成员类的继承类,再构建所述成员类。由于序列化时,数据对象视为具有继承类的成员类或者不具有继承类的成员类来处理,因此序列化所得字节流的首Sbit为继承系成员类开始状态标志时,开始构建的为数据对象的继承类,序列化所得字节流的首8bit为非继承系成员开始状态标志时,开始构建的为数据对象本身(数据对象本身也是类)。
[0125]在步骤S203中,将类的唯一类型序列转换为类的类名和继承层数,将类中各个成员类的标识转换为类的各个成员类。
[0126]其中,开始类的构建后,依次读取类对应的开始状态标志之后字节序列,类对应的开始状态标志之后为类的唯一类型序列,例如,序列化时类的唯一类型序列规定为32bit,则读取类对应的开始状态标志之后32bit的字节,作为类的唯一类型序列,转换为类的类名和继承层数。与序列化时得到类的唯一类型序列的方法对应,将字节流中类的唯一类型序列转换为类的类名和继承层数,包括:
[0127]将所述唯一类型序列的后24bit位转换为类的类名;
[0128]将唯一类型序列右移24bit后和十六进制OxfT求逻辑与,得到继承层数。
[0129]类的唯一类型序列读取之后,读取类的唯一类型序列之后类中成员类的标识,例如,序列化时规定类中成员类的标识为16bit,则以16bit为单位长度读取类中成员类的标识,并转换为类中的成员类。
[0130]如果成员类有多个,在一种可能的实施方式中,如果成员类有多个,由于序列化时每个成员类标识前都为类的唯一类型序列,因此继续读取字节流时,将再次读取到类的唯一类型序列,此时不再将读取到的类的唯一类型序列转换为类的继承层数和类名并输出,而是继续读取类的唯一类型序列后的下一个成员类的标识,并将该下一个成员类的标识转换为成员类并输出,以此类推。在读取完第一个成员类的标识,继续读取字节流过程中,读取到的是类的唯一类型序列还是类中基础类状态标志,可以事先在规定生成类的唯一类型序列的方式和设置类中基础类状态标志时进行区分,例如规定了类的唯一类型序列的高八位为继承层数,则类的唯一类型序列的高八位非零,而类中基础类状态标志则设置为0,从而可以通过读取到的高Sbit是否为零来判断将读取到类的唯一类型序列还是类中基础类状态标志:当读取到的高Sbit非O时,判断将读取到类的唯一类型序列,并读取完整的32bit类的唯一类型序列;当读取到的高8bit为O时,判断读到的为类中基础类状态标志,此时表示成员类已读取和转换完毕,将开始基础类型字节序列的读取和转换。在另一种可能的实施方式中,在协议中规定各个类(依据类名可获知是哪个类)中成员类的个数,依据协议中规定的所述个数,读取相同个数单位长度的成员类的标识,将所述标识转换为成员类,所述单位长度为成员类的标识的长度。
[0131]在步骤204中,读取到类中基础类状态标志时,依次读取字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型成员的标识、所述基础类型的成员的值序列。
[0132]在步骤S205中,将类中基础类型的唯一类型序列转换为基础类型,将基础类型成员的标识转换为基础类型的成员,以及将基础类型成员的值序列转换为基础类型的成员的值。
[0133]其中,例如,序列化中规定基础类状态标志为00,长度为8bit,则在类中成员类的标识之后,读取8bit字节,如果为00,则为基础类状态标志位,开始在类中填充其基础类型成员,如果不为00,则读取出错,对出错的处理可以重新开始反序列化或向系统发送错误报告等待系统的处理。读取到类中基础类状态标志后,依次读取其后的基础类型对应的唯一类型序列,例如,序列化中规定基础类型的唯一类型序列为24bit,则读取基础类状态标志后24bit字节,并转换为基础类型,从而得知类中基础类型成员的类型(int、double或string等)。然后依次读取基础类型对应的唯一类型序列之后基础类型成员的标识,例如,序列化时规定基础类型成员的标识为16bit,则读取基础类型对应的唯一类型序列后的16bit,作为基础类型成员的标识,根据协议转换为基础类型的成员。再依次读取基础类型成员标识后的基础类型成员的值序列,所述值序列的长度由基础类型成员的类型确定,例如已知基础类型成员为int类型,则其值序列的长度为16bit,如果基础类型成员为double类型,则其值序列的长度为32bit。有多个基础类型成员时,继续依次以基础类型的唯一类型序列、基础类型成员的标识和基础类型的成员的值序列为单元读取字节流并转换为基础类型成员。
[0134]在步骤S206中,读取到类对应的结束状态标志时,结束当次类的构建。
[0135]其中,读取到继承类对应的结束状态标志,即继承类结束状态标志时,结束当次继承类的构建;读取到非继承系成员类结束状态标志时,结束当次不具有继承类的成员类的构建;读取到继承系成员类结束状态标志时,结束当次具有继承类的成员类的构建
[0136]在步骤S207中,判断字节流是否读取完毕。当字节流未读取完毕时,重复步骤S201 至 S206。
[0137]在步骤S208中,当字节流读取完毕时,结束反序列化。
[0138]其中,当字节流未读取完毕时,继续依次读取字节流并进行数据对象的构建,当字节流读取完毕时,数据对象的构建完成,结束反序列化过程。
[0139]本申请实施例提供的反序列化方法,根据开始状态标志、基础类状态标志和结束状态标志实现结构化反序列解析过程,简单紧凑,解析效率高,并能得到具有完整继承关系的数据对象。
[0140]通过以上的方法实施例的描述,所属领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,并存储在一个存储介质中,包括若干指令用以使得一台智能设备执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:只读存储器(ROM)、随机存取存储器(RAM)、磁碟或者光盘等各种可以存储数据和程序代码的介质。
[0141]与本申请的第一方面相应,在本申请的第三方面,提供一种序列化装置。图3为本申请一示例性实施例示出的一种序列化装置的框图。如图3所示,所述装置包括:
[0142]数据对象遍历单元U301,用于遍历数据对象的每个类;
[0143]序列化单元U302,与U302连接,用于遍历到继承类或者不具有继承类的成员类时,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,并控制数据对象遍历单元根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后遍历具有继承类的成员类,输出与数据对象遍历单元遍历到的类对应的字节序列。
[0144]其中,所述与类对应的字节序列包括:所述类的唯一类型序列、所述类中各个成员类的标识、基础类状态标志、所述类中基础类型对应的字节序列以及与所述类对应的结束状态标志,所述类包括继承类、不具有继承类的成员类、具有继承类的成员类以及成员类的继承类。
[0145]图4为图3所示装置中序列化单元的框图。所述序列化单元U302,在一种可能的实施方式中,可以包括;
[0146]判断子单元U401,用于判断遍历到的类的类型;
[0147]控制子单元U402,与U401、U403、U404连接,用于根据判断单元判断得到的类的类型,控制序列生成子单元U403生成对应于所述类的序列,并控制组合输出子单元U404输出所述序列;
[0148]所述序列生成子单元U403,与U402和U404连接,包括:
[0149]开始状态标志生成模块U4031,用于根据遍历到的类生成与遍历到的类对应的开始状态标志;
[0150]唯一类型序列生成模块U4032,用于根据遍历到的类生成类的唯一类型序列,所述类的唯一类型序列根据类的继承层数和类名生成;
[0151]成员类标识生成模块U4033,用于根据遍历到的类中的成员类生成的成员类的标识;
[0152]基础类状态标志生成模块U4034,用于根据遍历到的类生成基础类状态标志;
[0153]基础类型字节序列生成模块U4035,用于生成遍历到的类中基础类型对应的字节序列,所述与遍历到的类中的基础类型对应的字节序列依次包括:基础类型的唯一类型序列、基础类型成员的标识,以及基础类型成员的值序列;
[0154]结束状态标志生成模块U4036,用于根据遍历到的类生成对应的结束状态标志;
[0155]组合输出子单元U404,与U402和U403连接,用于将序列生成单元生成的所述开始状态标志、所述唯
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1