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

文档序号:9687264阅读:306来源:国知局
序列化方法和装置、以及反序列化方法和装置的制造方法
【技术领域】
[0001]本发明涉及计算机技术领域,尤其涉及一种序列化方法和装置、以及反序列化方法和装置。
【背景技术】
[0002]序列化(serializat1n)是将数据对象状态转换为可保持或传输的格式的过程,以解决远程通讯和进程调用中数据对象无法直接传输,以及数据对象难以永久保存的问题。序列化机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以进行传输或者持久化存储到数据库或文件系统中。与序列化相对的是反序列化(deserializat1n),它将字节流再转换为数据对象。这两个过程结合起来,可以轻松地存储和传输数据。
[0003]目前已有的序列化技术,例如XML(可扩展标记语言)、JSON(英文全拼JavaScriptObject Notat1n),是一种轻量级的数据交换格式)、Google Protocol Buffer (Google 的一种数据交换的格式)及JAVA原生序列化等,是将数据对象的复杂类型拆分为简单类型,将简单类型转换为字节序列后组合为字节流,字节流输出时显示为一串字符。反序列化则是读取序列化生成的字节流,将字节序列按照与序列化对应的转换方法转换为简单类型,再组合填充为数据对象。
[0004]但发明人在实现发明的过程中发现,现有的序列化技术,将复杂类型拆分后对简单类型进行转换,类型之间的继承关系被忽略或减弱,使生成的字节序列缺乏自描述能力,而且通常对象转换为字节序列的过程复杂,描述字符过多,导致生成的字节序列数据量大,解析慢,因此目前尚未有继承关系完整且数据量小、高效的对象序列化方法及装置。

【发明内容】

[0005]为克服相关技术中序列化数据量大、继承关系不完整的问题,本申请提供一种序列化方法和装置,以及反序列化方法和装置。
[0006]根据本申请实施例的第一方面,提供一种序列化方法,包括:
[0007]遍历数据对象的每个类;
[0008]如果遍历到继承类或者不具有继承类的成员类,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列;
[0009]如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后,遍历具有继承类的成员类,输出与遍历到的类对应的字节序列。
[0010]其中,所述与遍历到的类对应的字节序列,包括:遍历到的类的唯一类型序列、遍历到的类中成员类的标识、基础类状态标志、遍历到的类中基础类型对应的字节序列以及与遍历到的类对应的结束状态标志;遍历到的类包括继承类、不具有继承类的成员类、具有继承类的成员类以及具有继承类的成员类的继承类;其中,遍历到的类的唯一类型序列根据遍历到的类的继承层数和类名生成。
[0011]其中,所述遍历到的类中成员类的标识根据遍历到的类中的成员类生成,所述开始状态标志、基础类状态标识和结束状态标志预先设定,所述类中基础类型对应的字节序列依次包括:预先设定的基础类型的唯一类型序列、基础类型成员的标识以及基础类型成员的值序列。
[0012]其中,根据遍历到的类的继承层数和类名生成遍历到的类的唯一类型序列,包括:
[0013]将遍历到的类的继承层数转换为Sbit的字节,其中,根类的继承层数为1,每多一层继承关系所述继承层数加I;
[0014]将遍历到的类的类名使用哈希算法转换为24bit的字节;
[0015]将继承层数转换而成的字节左移24bit,加上类名转换而成的24bit字节,得到遍历到的类的唯一类型序列。
[0016]其中,所述根据遍历到的类中的成员类生成遍历到的类中成员类的标识,为根据成员类在类中的次序将成员类定义为长度为16bit的字节;基础类型成员的标识的生成方法与遍历到的类中成员类的标识的生成方法相同。
[0017]根据本申请实施例的第二方面,提供一种反序列化方法,包括:
[0018]依次读取字节流;
[0019]读取到与类对应的开始状态标志时,依次读取字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
[0020]读取到类中基础类状态标志时,依次读取字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型成员的标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型成员的标识转换为基础类型的成员,以及将基础类型成员的值序列转换为基础类型的成员的值;
[0021]读取到与类对应的结束状态标志时,结束当次类的构建。
[0022]其中,所述将字节流中类的唯一类型序列转换为类的类名和继承层数,包括:
[0023]将所述唯一类型序列的后24bit位转换为类的类名;
[0024]将唯一类型序列右移24bit后和十六进制OxfT求逻辑与,得到继承层数。
[0025]根据本申请实施例的第三方面,提供一种序列化装置,包括:
[0026]数据对象遍历单元,用于遍历数据对象的每个类;
[0027]序列化单元,用于遍历到继承类或者不具有继承类的成员类时,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,并控制数据对象遍历单元根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后遍历具有继承类的成员类,输出与数据对象遍历单元遍历到的类对应的字节序列。
[0028]其中,所述与类对应的字节序列包括:所述类的唯一类型序列、所述类中各个成员类的标识、基础类状态标志、所述类中基础类型对应的字节序列以及与所述类对应的结束状态标志,所述类包括继承类、不具有继承类的成员类、具有继承类的成员类以及成员类的继承类。
[0029]根据本申请实施例的第四方面,提供一种反序列化装置,包括:
[0030]读取单元,用于依次读取字节流;
[0031]第一还原单元,用于读取到与类对应的开始状态标志后,依次读取单元依次读取到的字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
[0032]第二还原单元,用于读取单元读取到类中基础类状态标志后,将读取单元依次读取到的字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型的唯一标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型的唯一标识转换为基础类型的成员,以及将基础类型的成员的值序列转换为基础类型的成员的值;
[0033]类构建结束单元,用于当读取单元读取到类结束状态标志时,结束当次类的构建。
[0034]本申请实施例提供的技术方案具有以下有益效果:结合与类对应的开始状态标志和与类对应的字节序列来保持序列化中继承关系的完整性,以开始状态标志、类的唯一类型序列、类中成员类的标识、基础类状态标志、类中基础类型对应的字节序列以及与类对应的结束状态标志的排序结构对数据对象进行序列化,各个标志、唯一类型序列和标识不仅具有自描述能力,能完整地映射和表征类,而且结构紧凑,减少了序列化数据量。并且本申请实施例提供的技术方案无需将类全态信息进行序列化,而是以各个标志、唯一类型序列、标识来映射类,从而节省内存,大大提高序列化速度,且具有更高的通用性和兼容性。
[0035]应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
【附图说明】
[0036]为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0037]图1为本申请一示例性实施例示出的一种序列化方法的流程示意图。
[0038]图2为本申请一示例性实施例示出的一种反序列化方法的流程示意图。
[0039]图3为本申请一示例性实施例示出的一种序列化装置的框图。
[0040]图4为图3所示装置中序列化单元的框图。
[0041]图5为本申请一示例性实施例示出的一种反序列化装置的框图。
【具体实施方式】
[0042]这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
[0043]为了全面理解本申请,在以下详细描述中提到了众多具体的细节,但是本领域技术人员应该理解,本申请可以无需这些具体细节而实现。在其他实施例中,不详细描述公知的方法、过程、组件和电路,以免不必要地导致实施例模糊。
[0044]在本申请的第一方面,提供一种序列化方法。图1为本申请一示例性实施例示出的一种序列化方法的流程示意图,如图1所示,所述方法包括:
[0045]在步骤SlOl中,遍历数据对象的每个类;
[0046]在步骤S102中,如果遍历到继承类或者不具有继承类的成员类,根据遍历到的类输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列;
[0047]在步骤S103中,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,根据具有继承类的成员类的继承层次,逐层遍历具有继承类的成员类的继承类后,遍历具有继承类的成员类,输出与遍历到的类对应的字节序列。
[0048]其中,可以利用现有序列化技术中建立数据对象的对象图和对对象图进行遍历的方法来实现步骤SlOl。其中,数据对象本身为一个类,通常数据对象或者数据对象中的成员类可能继承了其他类,这种继承关系会在数据对象和其成员类的声明中体现,为保持类的继承关系,在序列化时,对数据对象的继承类,或者数据对象中成员类继承的类都进行序列化。因此,遍历数据对象的每个类,是遍历数据对象的继承类、数据对象本身、数据对象的成员类,且依次遍历数据对象的继承类、数据对象本身、数据对象的成员类,这种遍历方式和数据对象通常的描述顺序一致,即先是数据对象的声明,其次为数据对象自身基础数据,再后为数据对象的成员。
[0049]对数据对象的每个类本身的遍历可以按{当前类的继承,当前类,当前类的成员}进行二叉树后序遍历,即先遍历当前类的继承关系和类名,再遍历当前类的成员,然后遍历当前类自身的基础数据,所述当前类为当前遍历到的类。由于数据对象的类一般是按继承关系、成员、本身来描述,按{当前类的继承,当前类,当前类的成员}对每个类进行二叉树后序遍历更符合数据对象的描述情况。对数据对象的每个类也可以按{当前类的继承,当前类,当前类的成员}进行二叉树前序遍历,但由于编程语言
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1