CN105446722A - 序列化方法和装置、以及反序列化方法和装置 - Google Patents
序列化方法和装置、以及反序列化方法和装置 Download PDFInfo
- Publication number
- CN105446722A CN105446722A CN201410438753.0A CN201410438753A CN105446722A CN 105446722 A CN105446722 A CN 105446722A CN 201410438753 A CN201410438753 A CN 201410438753A CN 105446722 A CN105446722 A CN 105446722A
- Authority
- CN
- China
- Prior art keywords
- class
- foundation
- type
- sequence
- derived
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本申请实施例公开了一种序列化方法和装置,以及反序列化方法和装置。通过使用与类对应的开始状态标志和与类对应的字节序列来保持序列化中继承关系的完整性,以开始状态标志、类的唯一类型序列、类中成员类的标识、基础类状态标志、类中基础类型对应的字节序列以及与类对应的结束状态标志的排序结构对数据对象进行序列化,各个标志、唯一类型序列和标识不仅具有自描述能力,能完整地映射和表征类,而且结构紧凑,减少了序列化数据量。并且本申请实施例提供的技术方案无需将类全态信息进行序列化,而是以各个标志、唯一类型序列、标识来映射类,从而节省内存,大大提高序列化速度,且具有更高的通用性和兼容性。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种序列化方法和装置、以及反序列化方法和装置。
背景技术
序列化(serialization)是将数据对象状态转换为可保持或传输的格式的过程,以解决远程通讯和进程调用中数据对象无法直接传输,以及数据对象难以永久保存的问题。序列化机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以进行传输或者持久化存储到数据库或文件系统中。与序列化相对的是反序列化(deserialization),它将字节流再转换为数据对象。这两个过程结合起来,可以轻松地存储和传输数据。
目前已有的序列化技术,例如XML(可扩展标记语言)、JSON(英文全拼JavaScriptObjectNotation),是一种轻量级的数据交换格式)、GoogleProtocolBuffer(Google的一种数据交换的格式)及JAVA原生序列化等,是将数据对象的复杂类型拆分为简单类型,将简单类型转换为字节序列后组合为字节流,字节流输出时显示为一串字符。反序列化则是读取序列化生成的字节流,将字节序列按照与序列化对应的转换方法转换为简单类型,再组合填充为数据对象。
但发明人在实现发明的过程中发现,现有的序列化技术,将复杂类型拆分后对简单类型进行转换,类型之间的继承关系被忽略或减弱,使生成的字节序列缺乏自描述能力,而且通常对象转换为字节序列的过程复杂,描述字符过多,导致生成的字节序列数据量大,解析慢,因此目前尚未有继承关系完整且数据量小、高效的对象序列化方法及装置。
发明内容
为克服相关技术中序列化数据量大、继承关系不完整的问题,本申请提供一种序列化方法和装置,以及反序列化方法和装置。
根据本申请实施例的第一方面,提供一种序列化方法,包括:
遍历数据对象的每个类;
如果遍历到继承类或者不具有继承类的成员类,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列;
如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后,遍历具有继承类的成员类,输出与遍历到的类对应的字节序列。
其中,所述与遍历到的类对应的字节序列,包括:遍历到的类的唯一类型序列、遍历到的类中成员类的标识、基础类状态标志、遍历到的类中基础类型对应的字节序列以及与遍历到的类对应的结束状态标志;遍历到的类包括继承类、不具有继承类的成员类、具有继承类的成员类以及具有继承类的成员类的继承类;其中,遍历到的类的唯一类型序列根据遍历到的类的继承层数和类名生成。
其中,所述遍历到的类中成员类的标识根据遍历到的类中的成员类生成,所述开始状态标志、基础类状态标识和结束状态标志预先设定,所述类中基础类型对应的字节序列依次包括:预先设定的基础类型的唯一类型序列、基础类型成员的标识以及基础类型成员的值序列。
其中,根据遍历到的类的继承层数和类名生成遍历到的类的唯一类型序列,包括:
将遍历到的类的继承层数转换为8bit的字节,其中,根类的继承层数为1,每多一层继承关系所述继承层数加1;
将遍历到的类的类名使用哈希算法转换为24bit的字节;
将继承层数转换而成的字节左移24bit,加上类名转换而成的24bit字节,得到遍历到的类的唯一类型序列。
其中,所述根据遍历到的类中的成员类生成遍历到的类中成员类的标识,为根据成员类在类中的次序将成员类定义为长度为16bit的字节;基础类型成员的标识的生成方法与遍历到的类中成员类的标识的生成方法相同。
根据本申请实施例的第二方面,提供一种反序列化方法,包括:
依次读取字节流;
读取到与类对应的开始状态标志时,依次读取字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
读取到类中基础类状态标志时,依次读取字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型成员的标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型成员的标识转换为基础类型的成员,以及将基础类型成员的值序列转换为基础类型的成员的值;
读取到与类对应的结束状态标志时,结束当次类的构建。
其中,所述将字节流中类的唯一类型序列转换为类的类名和继承层数,包括:
将所述唯一类型序列的后24bit位转换为类的类名;
将唯一类型序列右移24bit后和十六进制0xff求逻辑与,得到继承层数。
根据本申请实施例的第三方面,提供一种序列化装置,包括:
数据对象遍历单元,用于遍历数据对象的每个类;
序列化单元,用于遍历到继承类或者不具有继承类的成员类时,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,并控制数据对象遍历单元根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后遍历具有继承类的成员类,输出与数据对象遍历单元遍历到的类对应的字节序列。
其中,所述与类对应的字节序列包括:所述类的唯一类型序列、所述类中各个成员类的标识、基础类状态标志、所述类中基础类型对应的字节序列以及与所述类对应的结束状态标志,所述类包括继承类、不具有继承类的成员类、具有继承类的成员类以及成员类的继承类。
根据本申请实施例的第四方面,提供一种反序列化装置,包括:
读取单元,用于依次读取字节流;
第一还原单元,用于读取到与类对应的开始状态标志后,依次读取单元依次读取到的字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
第二还原单元,用于读取单元读取到类中基础类状态标志后,将读取单元依次读取到的字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型的唯一标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型的唯一标识转换为基础类型的成员,以及将基础类型的成员的值序列转换为基础类型的成员的值;
类构建结束单元,用于当读取单元读取到类结束状态标志时,结束当次类的构建。
本申请实施例提供的技术方案具有以下有益效果:结合与类对应的开始状态标志和与类对应的字节序列来保持序列化中继承关系的完整性,以开始状态标志、类的唯一类型序列、类中成员类的标识、基础类状态标志、类中基础类型对应的字节序列以及与类对应的结束状态标志的排序结构对数据对象进行序列化,各个标志、唯一类型序列和标识不仅具有自描述能力,能完整地映射和表征类,而且结构紧凑,减少了序列化数据量。并且本申请实施例提供的技术方案无需将类全态信息进行序列化,而是以各个标志、唯一类型序列、标识来映射类,从而节省内存,大大提高序列化速度,且具有更高的通用性和兼容性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请一示例性实施例示出的一种序列化方法的流程示意图。
图2为本申请一示例性实施例示出的一种反序列化方法的流程示意图。
图3为本申请一示例性实施例示出的一种序列化装置的框图。
图4为图3所示装置中序列化单元的框图。
图5为本申请一示例性实施例示出的一种反序列化装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
为了全面理解本申请,在以下详细描述中提到了众多具体的细节,但是本领域技术人员应该理解,本申请可以无需这些具体细节而实现。在其他实施例中,不详细描述公知的方法、过程、组件和电路,以免不必要地导致实施例模糊。
在本申请的第一方面,提供一种序列化方法。图1为本申请一示例性实施例示出的一种序列化方法的流程示意图,如图1所示,所述方法包括:
在步骤S101中,遍历数据对象的每个类;
在步骤S102中,如果遍历到继承类或者不具有继承类的成员类,根据遍历到的类输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列;
在步骤S103中,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,根据具有继承类的成员类的继承层次,逐层遍历具有继承类的成员类的继承类后,遍历具有继承类的成员类,输出与遍历到的类对应的字节序列。
其中,可以利用现有序列化技术中建立数据对象的对象图和对对象图进行遍历的方法来实现步骤S101。其中,数据对象本身为一个类,通常数据对象或者数据对象中的成员类可能继承了其他类,这种继承关系会在数据对象和其成员类的声明中体现,为保持类的继承关系,在序列化时,对数据对象的继承类,或者数据对象中成员类继承的类都进行序列化。因此,遍历数据对象的每个类,是遍历数据对象的继承类、数据对象本身、数据对象的成员类,且依次遍历数据对象的继承类、数据对象本身、数据对象的成员类,这种遍历方式和数据对象通常的描述顺序一致,即先是数据对象的声明,其次为数据对象自身基础数据,再后为数据对象的成员。
对数据对象的每个类本身的遍历可以按{当前类的继承,当前类,当前类的成员}进行二叉树后序遍历,即先遍历当前类的继承关系和类名,再遍历当前类的成员,然后遍历当前类自身的基础数据,所述当前类为当前遍历到的类。由于数据对象的类一般是按继承关系、成员、本身来描述,按{当前类的继承,当前类,当前类的成员}对每个类进行二叉树后序遍历更符合数据对象的描述情况。对数据对象的每个类也可以按{当前类的继承,当前类,当前类的成员}进行二叉树前序遍历,但由于编程语言的语法都是先构造父类再构造子类,使用二叉树后序遍历更符合类的构造。
其中,所述遍历到的类包括继承类、不具有继承类的成员类、具有继承类的成员类以及具有继承类的成员类的继承类。所述与遍历到的类对应的字节序列包括:类的唯一类型序列、类中成员类的标识、基础类状态标志、类中基础类型对应的字节序列以及与类对应的结束状态标志,
其中,所述类的唯一类型序列根据类的继承层数和类名生成,所述类中各个成员类的标识根据类的各个成员生成,所述类中的基础类型对应的字节序列依次包括:预先设定的基础类型的唯一类型序列、基础类型成员的标识,以及基础类型成员的值序列。
其中,所述类包括继承类、不具有继承类的成员类和具有继承类的成员类。所述继承类、不具有继承类的成员类和具有继承类的成员类为当前类(遍历到的类)的类型,所述继承类为数据对象具有的继承类,或者数据对象的成员类具有的继承类,通常为数据对象的声明或者数据对象的成员类的声明中声明的父类。数据对象本身和数据对象的成员类都可当作成员类,分为不具有继承类的成员类和具有继承类的成员类。
其中,所述开始状态标志表示某个类的字节序列开始,从遍历的角度讲,为开始对当前类进行二叉树遍历,所述二叉树遍历优选为二叉树后序遍历。所述开始状态标志与当前类的类型对应,包括继承类开始状态标志、非继承系成员类开始状态标志以及继承系成员类开始状态标志,所述非继承系成员类开始状态标志为不具有继承类的成员类的开始状态标志,所述继承系成员类开始状态标志位具有继承类的成员类的开始状态标志。由于开始状态标志与类的类型对应,因此开始状态标志标示了当前类是否是继承类以及是否具有继承类。开始状态标志之后为与类对应的字节序列,结合开始状态标志和与类对应的字节序列可以得到类的继承关系,从而可以在序列化中保持继承关系的完整性。
对当前类开始二叉树遍历后,遍历到当前类的继承关系和类名时,输出当前类的唯一类型序列,所述类的唯一类型序列根据当前类的继承关系和类名生成。其中,所述继承关系为当前类的继承层数,通常当前类的继承层数可以在当前类的继承声明中得出,或者隐含于系统类库的结构中,例如类库中,Red类为Color类的子类,Wd-Red类为Red类的子类,Color类为根类(无父类),由类库的结构,即类库中Color类、Red类和Wd-Red类的继承关系,设Color类的继承层数为1,则Wd-Red类的继承层数为3,Red类的继承层数为2,Color类、Red类和Wd-Red类的继承层数可以由系统自动给出。
根据当前类的继承层数和类名生成唯一类型序列,在一种可能的实施方式中,包括:
将所述类的继承层数转换为8bit的字节,其中,根类的继承层数为1,每多一层继承关系对应类的继承层数加1;
将所述类的类名使用哈希算法转换为24bit的字节;
将继承层数转换而成的字节左移24bit,加上类名转换而成的24bit字节,得到所述类的唯一类型序列。
得到的当前类的唯一类型序列为32bit。由于使用哈希算法转换类名,因此唯一类型序列和当前类的类名是一一对应的,具有唯一性。同时当前类的唯一类型序列将当前类的继承层数(首8bit字节)和类名(后24bit字节)结合起来,唯一地标明了当前类的类名和继承层次,结合对应于当前类的开始状态标志,简洁紧凑地标示了当前类的继承关系,从而更有利于保证序列化时继承关系的完整性。其中,以8bit长度的字节,以及以24bit长度的字节已经足够分别描述继承层数和类名,不需更长的字节,避免产生不必要的字节,增加数据量。同时继承层数和类名哈希结合在一个32bit字节序列中,可以做到256层继承,16776960个类型的容量。
其中,在对当前类进行二叉树遍历,遍历到当前类的成员类时,例如对当前类进行二叉树后序遍历,遍历到当前类的继承关系和类名,输出当前类的唯一类型序列之后,遍历到当前类的成员类时,输出当前类中成员类的标识,所述标识用于标示各个成员类在当前类中的次序。所述根据类的成员类生成成员类的标识,为根据所述成员类在当前类中的次序将所述成员类定义为长度为16bit的字节。例如,将当前类的第一个成员类定义为00(十六进制),将当前类的第二个成员类定义为01,以此类推。
也可以将成员类定义为其他可以表征成员类在当前类中次序的16bit字节,例如,将当前类的第一个成员类定义为02,将当前类的第二个成员类类定义为04,以此类推。由于成员类的标识用于标识成员类在类中的次序,因此同一个类中各个成员类的标识只要彼此不同,同时可以根据标识识别成员类在类中的次序即可。需要说明的是,序列化机制只保存对象的类型信息、属性的类型信息和属性值;因此对于类的成员类,不需详细记录其方法,而是标识其在类中的次序;同时,由于序列化和反序列化之间存在转换协议,所述转换协议预先制定,包括序列化和反序列化转换所遵循的规则,例如唯一类型序列的长度和构成、成员标识的长度和所述标识对应的次序、状态标志的含义等。在所述转换协议中,同时规定某类中成员类的标识所标识的次序对应的该类的成员类,从而在反序列化时根据成员类的标识还原类的成员类。因此遍历到类的成员类时,将成员类定义为标识,可以使数据对象序列化产生的字节序列更紧凑,省略过多的描述,减少数据量。通常16bit长度的字节足以记录类中成员类的次序,因而将成员类标识的长度规定为16bit。如果成员类为list类,则将list类中的各个重复元素都定义为0,因为list类中的元素是重复的,不属于成员类的范畴,但为了体现list类的结构,将其中的重复元素以标识0来表示。
在一种可能的实施方式中,如果当前类中的成员类有多个,遍历到当前类的第一个成员类,并输出第一个成员类的标识后,当遍历到当前类的第二个成员类时,再次输出当前类的唯一类型序列后,输出第二个成员类的标识,当遍历到当前类的第三个成员类时,再次输出当前类的唯一类型序列后,输出第三个成员类的标识,以此类推,以保证当前类的成员类的从属关系的正确,及将成员类的标识在字节流中分开来。
在另一种可能的实施方式中,如果当前类的成员类有多个,依次遍历当前类的成员类并依次输出成员类的标识,直至当前类的成员类遍历完毕。
其中,所述基础类状态标志,用于表示在对类进行二叉树遍历时,开始对类自身的基础数据进行遍历,例如对当前类按{当前类的继承,当前类,当前类的成员}进行二叉树后序遍历,当前类的继承和当前类的成员类遍历完毕,开始对当前类,即当前类自身的基础数据进行遍历时,输出基础类状态标志。在基础类状态标志后,输出类中基础类型对应的字节序列。即输出的整个序列中,基础类状态标志之后为基础类型对应的字节序列,在反序列化时,读取到基础类状态标志,反序列化机制将会开始类的基础类型的还原。基础类状态标志预先设定,且与其他标志及类的唯一类型序列区分开来,例如类的唯一类型序列的高八位非0(表示继承层数,或人为设置用于区分),其他标志非0,则可以将基础类状态标志设定为0,用于在字节流中准确地表示基础类型字节序列的开始。基础类状态标志为固定标志,并不随类的类型变化。
其中,基础类型对应的字节序列,依次包括:预先设定的基础类型的唯一类型序列、基础类型成员的标识,以及基础类型成员的值序列。基础类型对应的字节序列紧接基础类状态标志。
所述基础类型包括int、boolean、long、double、float、short、byte、byte[]以及string,对每个基础类型设定一个唯一类型序列与之对应,例如,int设定为1(十进制数字,二进制序列为00000001),boolean设定为11,long设定为10,double设定为14,float设定为15,short设定为16,byte设定为17,byte[]设定为13,string设定为12,基础类型的唯一类型序列也可以分别设定为其他数字,例如int设定为1(十进制数字,二进制序列为00000001),boolean设定为2,long设定为3,double设定为4,float设定为5,short设定为6,byte设定为7,byte[]设定为8,string设定为9。为使说明简单明了,以上数字以十进制表示。由于一个程序环境中,基础类型的个数通常是固定的,基础类型的唯一类型序列以彼此不同的大小不超过100(十进制)的数字序列表示已足够。基础类型的唯一类型序列长度为24bit,由于基础类型不存在继承关系,因此不需在其唯一类型序列中增加继承层数字节,为保持和类名相同的长度,以及和标识的长度区分开,故将基础类型的唯一类型序列长度设定为24bit,其长度也可以为其他大小,例如16bit。
所述基础类型成员的标识,用于标识基础类型的成员在其所属类中的次序,基础类型成员的标识与类中成员类的标识类同,例如,基础类型的第一个成员定义为00(十六进制),基础类型的第二个成员定义为01,以此类推。由于基础类型成员的标识紧跟基础类型的唯一类型序列,因此基础类型成员的标识可以和类中成员类的标识相同,由其在整个序列中的位置来区分为基础类型成员的标识还是类中成员类的标识。基础类型成员的标识的长度与类中成员类的标识的长度相同。基础类型成员的标识结合类中成员类的标识,用于保证类中成员不丢失,防止反序列化时类中成员缺失。需要说明的是,对于类中的每一个基础类型成员,都先输出其所属基础类型对应的唯一类型序列,然后输出其在类中作为基础类型成员的次序对应的标识,接着输出基础类型成员的值序列,也就是说,对于类中的每一个基础类型成员,都是以基础类型对应的唯一类型序列、基础类型成员成员的标识和基础类型成员的值序列为单元进行输出。
所述基础类型成员的值序列紧接在基础类型成员的标识之后,所述基础类型成员的值序列为基础类型成员的值对应的序列,例如成员为int类型,值为66,则其序列为00000042(十六进制),所述值序列的长度由其对应的基础类型决定,例如,通常系统中int类型变量或数值的长度为16bit,double类型变量或数值的长度为32bit。
其中,当遍历完对象中一个类时,输出与当前类(遍历到的类)对应的结束状态标志,表示当前类遍历及输出完毕。当前类的结束状态标志与当前类的开始状态标志对应,两者之间的部分为当前类序列化的内容。当前类的结束状态标志和当前类的开始状态标志首尾呼应,将对象的整个序列按类分块,使序列的结构更明晰,并且结束状态标志和开始状态标志和类的类型对应,开始状态标志包括继承类开始状态标志、非继承系成员类开始状态标识以及继承系成员类开始状态标志,相应地,结束状态标志包括继承类结束状态标志、非继承系成员类结束状态标识以及继承系成员类结束状态标志。
开始状态标志、结束状态标志和基础类状态标志都是预先设定,长度为8bit,例如:
基础状态标志(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)作为序列化继承系成员类本身结束时的标志,分别与继承系成员类开始状态标志中的FLAG_STRUCTS_START和FLAG_STRUCT_START对应。由于继承系成员类序列化在成员类本身序列化完毕后即结束,结束状态已经由成员类结束状态标志表示了,可以不必再输出继承系成员类结束状态标志,也可以输出继承系成员类结束状态标志来进一步表示继承系成员类序列化结束。继承系成员类结束状态标志,也可以为FLAG_STRUCTS_END与FLAG_STRUCT_END取或,相应的二进制序列为00001011。开始状态标志、结束状态标志和基础类状态标志也可以设定为其他的二进制序列。
在遍历数据对象中的每个类时:如果遍历到继承类,即遍历到的类为数据对象的继承类时,输出继承类开始状态标志,所述继承类的唯一类型序列和唯一标识,所述继承类的基础类状态标志,以及所述继承类中基础类型对应的字节序列,当继承类遍历完毕,输出继承类结束状态标志。需要说明的是,对数据对象的遍历开始时,首先遍历到的是数据对象本身,此时根据数据对象的声明或者类库的结构,判断数据对象是否具有继承类,当数据对象具有继承类时,将数据对象视为具有继承类的成员类,遍历数据对象的继承类进行序列化并输出,数据对象具有多层继承类时,逐层序列化并输出数据对象的继承类,然后序列化数据对象本身并输出;当时对象不具有继承类时,将数据对象视为不具有继承类的成员类,序列化数据对象本身并输出。也就是说,数据对象本身可视为不具有继承关系的成员类(数据对象不具有继承类时)或者具有继承关系的成员类(数据对象具有继承类时)来进行处理。
如果遍历到不具有继承类的成员类,即遍历到的类为数据对象中不具有继承类的成员类时,则输出成员类开始状态标志,所述成员类的唯一类型序列和唯一标识,所述成员类的基础类状态标志,以及所述成员类中基础类型对应的字节序列,当成员类遍历完毕,输出成员类结束状态标志。
如果遍历到具有继承类的成员类,即遍历到的类为数据对象中具有继承类的成员类时,则输出继承系成员类开始状态标志。由于对该成员类的继承类也需进行序列化,因此根据所述成员类的继承层次逐层输出所述成员类的继承类,所述成员类的继承类输出完毕,输出所述成员类。其中,输出所述成员类的继承类,与上述输出数据对象的继承类的方法类同,如果只有一层继承类,则输出所述继承类的唯一类型序列和唯一标识、所述继承类的基础类状态标志、所述继承类中基础类型对应的字节序列以及继承类结束状态标志,继承类结束状态标志用于标示当前继承类序列化完毕,由于已经输出继承系成员类开始状态标志,因此不必输出继承类开始状态标志,而只需以继承类结束状态标志来标示继承类序列化完毕。如果有多层继承类,则对每层继承类输出继承类开始状态标志,所述继承类的唯一类型序列和唯一标识、所述继承类的基础类状态标志、所述继承类中基础类型对应的字节序列以及继承类结束状态标志,此时使用完整的继承类开始状态标志和对应的继承类结束状态标志,用于区分不同层次的继承类。
输出所述成员类包括输出所述成员类的唯一类型序列和唯一标识,所述成员类的基础类状态标志,以及所述成员类中基础类型对应的字节序列,当具有继承类的成员类遍历完毕,输出继承系成员类结束状态标志,由于成员类只有单层,且已经输出继承系成员类开始状态标志,因此不必输出成员类开始状态标志,而只需以成员类结束状态标志来标示成员类序列化完毕,输出成员类结束状态标志后,对于具有继承类的成员类的输出已经完毕,可以不用输出继承系成员类结束标志,也可以在成员类结束状态标志之后输出继承系成员类结束标志,更明确地标示具有继承类的成员类输出完毕,但会增加整体序列的数据量。
下面用本申请的一个应用案例进一步说明本申请,以使本领域技术人员更好地理解本申请的原理和应用。例如,一个数据对象SerialLTest,继承Parent类,包含一个不具有继承类的成员类Contain。Parent类具有int类型(属于基础类型)的成员parentVersion,其值为10;SerialLTest具有int类型的成员version,其值为66;Contain具有int类型的成员containVersion,其值为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。
序列化的结果(十六进制)如下:
05010FF52E0000000000010001000000
0A02010223792A000000000001000100
0000420101EFBD180002000000010001
0000000B020A
其中:
05:遍历SerialLTest对象,其具有继承类Parent,输出继承系成员类开始状态标志(FLAG_STRUCTS_START|FLAG_STRUCT_START),即05;
010FF52E:类Parent的唯一类型序列;
0000:Parent的第一个成员类;
00:FLAG_VALUE,基础类状态标志;
000001:int基础类型;
0001:parentVersion的标识,作为基础类型成员在Parent里的次序;
0000000A:parentVersion的值,是10(十进制);
02:FLAG_STRUCT_END,表示Parent结束;
01:继续遍历,回到数据对象本身SerialTest,输出成员类开始状态标志FLAG_STRUCT_START;
0223792A:类SeriallTest的唯一类型序列;
0000:SerialTest中成员类的标识;
00:FLAG_VALUE,基础类状态标志;
000001:int基础类型;
0001:基础类型成员version在SeriallTest里的标识;
00000042:version值,是66(十进制);
01:遍历SerialTest的成员类Contain,Contain为不具有继承类的成员类,输出成员类开始状态标志FLAG_STRUCT_START;
01EFBD18:Contain的唯一类型序列;
0002:Contain的标识;
00:FLAG_VALUE,基础类状态标志;
000001:int基础类型;
0001:containVersion的标识;
0000000B:containVersion的值是11(十进制);
02:成员类结束标志FLAG_STRUCT_END,表示类Contain结束;
0A:继承系成员类结束状态标志,FLAG_STRUCTS_END|FLAG_STRUCT_END,表示SerialTest类结束。数据对象序列化完毕。
与本应用案例的结果对比,使用常规的Java序列化上述同一个对象,得到的序列化结果(十六进制)如下:
ACED00057372000A53657269616C5465
73740552815AAC6602F6020002490007
76657273696F6E4C0003636F6E740009
4C636F6E7461696E3B78720006706172
656E740EDBD2BD85EE637A0200014900
0D706172656E7456657273696F6E7870
0000000A0000004273720007636F6E74
61696EFCBBE60EFBCB60C70200014900
0E636F6E7461696E56657273696F6E78
700000000B
由于Java序列化结果繁琐冗长,故不一一注释。由此可见,本申请实施例所提供的序列化方法,所得的序列化结果具有完整的继承性,而且数据量大大减少,而且序列化过程得到简化,使序列化更为高效。
相应于本申请的第一方面,在本申请的第二方面,提供一种反序列化方法。需要说明的是,反序列化方法与序列化方法是相应的,反序列化方法通过事先建立的协议,遵照协议针对序列化得到的字节流反序列化。所述协议包括字节流的结构、字节序列的含义、转换的方式等。本申请实施例中,所述协议包括与预设的开始状态标志、基础类状态标志、结束状态标志的长度和含义,类的唯一类型序列的长度和构成,类中成员类的标识的长度和对应的成员类,预设的基础类型对应的唯一类型序列长度和对应的基础类型,基础类型成员的标识的长度和对应的基础类型,以及上述各个标志、类型序列、标识在字节流中排列的顺序(字节流的结构)等,以上所述长度为字节或序列的长度。本申请实施例反序列化和序列化协议的制订与常规的反序列化和序列化协议的制订方法相同。
本申请实施例提供的反序列化方法依据制订的协议对序列化生成的字节流进行反序列化。其中,预设的开始状态标志、基础类状态标志、结束状态标志,类的唯一类型序列,类中成员类的标识,预设的基础类型对应的唯一类型序列,基础类型成员的标识,以及基础类型成员的值序列,与本申请第一方面提供的序列化方法中的概念相同,不再赘述。
图2为本申请一示例性实施例示出的一种反序列化方法的流程示意图,如图2所示,所述方法包括:
在步骤S201中,依次读取字节流。
在步骤S202中,读取到与类对应的开始状态标志时,依次读取字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识。
所述类包括继承类、具有继承类的成员类和不具有继承类的成员类。序列化所得字节流的最前规定长度的字节即类对应的开始状态标志,所述规定长度为序列化时类对应的开始状态标志的长度,例如,若序列化中类对应开始状态标志的规定长度为8bit,则序列化所得字节流的首8bit即类的对应开始状态标志,因此读取字节流的首8bit,得到类对应开始状态标志。读取到继承类对应的开始状态标志,即继承类开始状态标志时,开始继承类的构建;读取到非继承系成员类开始状态标志时,开始不具有继承类的成员类的构建;读取到继承系成员类开始状态标志时,开始具有继承类的成员类的构建,对于具有继承类的成员类的构建,先构建所述成员类的继承类,再构建所述成员类。由于序列化时,数据对象视为具有继承类的成员类或者不具有继承类的成员类来处理,因此序列化所得字节流的首8bit为继承系成员类开始状态标志时,开始构建的为数据对象的继承类,序列化所得字节流的首8bit为非继承系成员开始状态标志时,开始构建的为数据对象本身(数据对象本身也是类)。
在步骤S203中,将类的唯一类型序列转换为类的类名和继承层数,将类中各个成员类的标识转换为类的各个成员类。
其中,开始类的构建后,依次读取类对应的开始状态标志之后字节序列,类对应的开始状态标志之后为类的唯一类型序列,例如,序列化时类的唯一类型序列规定为32bit,则读取类对应的开始状态标志之后32bit的字节,作为类的唯一类型序列,转换为类的类名和继承层数。与序列化时得到类的唯一类型序列的方法对应,将字节流中类的唯一类型序列转换为类的类名和继承层数,包括:
将所述唯一类型序列的后24bit位转换为类的类名;
将唯一类型序列右移24bit后和十六进制0xff求逻辑与,得到继承层数。
类的唯一类型序列读取之后,读取类的唯一类型序列之后类中成员类的标识,例如,序列化时规定类中成员类的标识为16bit,则以16bit为单位长度读取类中成员类的标识,并转换为类中的成员类。
如果成员类有多个,在一种可能的实施方式中,如果成员类有多个,由于序列化时每个成员类标识前都为类的唯一类型序列,因此继续读取字节流时,将再次读取到类的唯一类型序列,此时不再将读取到的类的唯一类型序列转换为类的继承层数和类名并输出,而是继续读取类的唯一类型序列后的下一个成员类的标识,并将该下一个成员类的标识转换为成员类并输出,以此类推。在读取完第一个成员类的标识,继续读取字节流过程中,读取到的是类的唯一类型序列还是类中基础类状态标志,可以事先在规定生成类的唯一类型序列的方式和设置类中基础类状态标志时进行区分,例如规定了类的唯一类型序列的高八位为继承层数,则类的唯一类型序列的高八位非零,而类中基础类状态标志则设置为0,从而可以通过读取到的高8bit是否为零来判断将读取到类的唯一类型序列还是类中基础类状态标志:当读取到的高8bit非0时,判断将读取到类的唯一类型序列,并读取完整的32bit类的唯一类型序列;当读取到的高8bit为0时,判断读到的为类中基础类状态标志,此时表示成员类已读取和转换完毕,将开始基础类型字节序列的读取和转换。在另一种可能的实施方式中,在协议中规定各个类(依据类名可获知是哪个类)中成员类的个数,依据协议中规定的所述个数,读取相同个数单位长度的成员类的标识,将所述标识转换为成员类,所述单位长度为成员类的标识的长度。
在步骤204中,读取到类中基础类状态标志时,依次读取字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型成员的标识、所述基础类型的成员的值序列。
在步骤S205中,将类中基础类型的唯一类型序列转换为基础类型,将基础类型成员的标识转换为基础类型的成员,以及将基础类型成员的值序列转换为基础类型的成员的值。
其中,例如,序列化中规定基础类状态标志为00,长度为8bit,则在类中成员类的标识之后,读取8bit字节,如果为00,则为基础类状态标志位,开始在类中填充其基础类型成员,如果不为00,则读取出错,对出错的处理可以重新开始反序列化或向系统发送错误报告等待系统的处理。读取到类中基础类状态标志后,依次读取其后的基础类型对应的唯一类型序列,例如,序列化中规定基础类型的唯一类型序列为24bit,则读取基础类状态标志后24bit字节,并转换为基础类型,从而得知类中基础类型成员的类型(int、double或string等)。然后依次读取基础类型对应的唯一类型序列之后基础类型成员的标识,例如,序列化时规定基础类型成员的标识为16bit,则读取基础类型对应的唯一类型序列后的16bit,作为基础类型成员的标识,根据协议转换为基础类型的成员。再依次读取基础类型成员标识后的基础类型成员的值序列,所述值序列的长度由基础类型成员的类型确定,例如已知基础类型成员为int类型,则其值序列的长度为16bit,如果基础类型成员为double类型,则其值序列的长度为32bit。有多个基础类型成员时,继续依次以基础类型的唯一类型序列、基础类型成员的标识和基础类型的成员的值序列为单元读取字节流并转换为基础类型成员。
在步骤S206中,读取到类对应的结束状态标志时,结束当次类的构建。
其中,读取到继承类对应的结束状态标志,即继承类结束状态标志时,结束当次继承类的构建;读取到非继承系成员类结束状态标志时,结束当次不具有继承类的成员类的构建;读取到继承系成员类结束状态标志时,结束当次具有继承类的成员类的构建
在步骤S207中,判断字节流是否读取完毕。当字节流未读取完毕时,重复步骤S201至S206。
在步骤S208中,当字节流读取完毕时,结束反序列化。
其中,当字节流未读取完毕时,继续依次读取字节流并进行数据对象的构建,当字节流读取完毕时,数据对象的构建完成,结束反序列化过程。
本申请实施例提供的反序列化方法,根据开始状态标志、基础类状态标志和结束状态标志实现结构化反序列解析过程,简单紧凑,解析效率高,并能得到具有完整继承关系的数据对象。
通过以上的方法实施例的描述,所属领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,并存储在一个存储介质中,包括若干指令用以使得一台智能设备执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:只读存储器(ROM)、随机存取存储器(RAM)、磁碟或者光盘等各种可以存储数据和程序代码的介质。
与本申请的第一方面相应,在本申请的第三方面,提供一种序列化装置。图3为本申请一示例性实施例示出的一种序列化装置的框图。如图3所示,所述装置包括:
数据对象遍历单元U301,用于遍历数据对象的每个类;
序列化单元U302,与U302连接,用于遍历到继承类或者不具有继承类的成员类时,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,并控制数据对象遍历单元根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后遍历具有继承类的成员类,输出与数据对象遍历单元遍历到的类对应的字节序列。
其中,所述与类对应的字节序列包括:所述类的唯一类型序列、所述类中各个成员类的标识、基础类状态标志、所述类中基础类型对应的字节序列以及与所述类对应的结束状态标志,所述类包括继承类、不具有继承类的成员类、具有继承类的成员类以及成员类的继承类。
图4为图3所示装置中序列化单元的框图。所述序列化单元U302,在一种可能的实施方式中,可以包括;
判断子单元U401,用于判断遍历到的类的类型;
控制子单元U402,与U401、U403、U404连接,用于根据判断单元判断得到的类的类型,控制序列生成子单元U403生成对应于所述类的序列,并控制组合输出子单元U404输出所述序列;
所述序列生成子单元U403,与U402和U404连接,包括:
开始状态标志生成模块U4031,用于根据遍历到的类生成与遍历到的类对应的开始状态标志;
唯一类型序列生成模块U4032,用于根据遍历到的类生成类的唯一类型序列,所述类的唯一类型序列根据类的继承层数和类名生成;
成员类标识生成模块U4033,用于根据遍历到的类中的成员类生成的成员类的标识;
基础类状态标志生成模块U4034,用于根据遍历到的类生成基础类状态标志;
基础类型字节序列生成模块U4035,用于生成遍历到的类中基础类型对应的字节序列,所述与遍历到的类中的基础类型对应的字节序列依次包括:基础类型的唯一类型序列、基础类型成员的标识,以及基础类型成员的值序列;
结束状态标志生成模块U4036,用于根据遍历到的类生成对应的结束状态标志;
组合输出子单元U404,与U402和U403连接,用于将序列生成单元生成的所述开始状态标志、所述唯一类型序列、所述各个成员类的标识、所述基础类状态标志、所述基础类型字节序列以及所述结束状态标志组合输出,其中所述基础类型字节序列由基础类型的唯一类型序列、基础类型成员的标识以及基础类型成员的值序列依次组合。
其中,所述控制子单元,用于当判断单元判断遍历到的类为继承类时,控制序列生成子单元生成继承类的序列;当判断单元判断遍历到的类为不具有继承类的成员类时,控制序列生成子单元生成不具有继承类的成员类的序列;当遍历到的类为具有继承类的成员类时,控制序列生成子单元根据所述成员类的继承层次逐层生成所述成员类的继承类的序列后,控制序列生成子单元生成所述成员类的序列。
其中,所述唯一类型序列生成模块,在一种可能的实施方式中,可以包括:
继承层数转换子模块,用于将类的继承层数转换为8bit的字节;
类名转换子模块,用于将类的类名使用哈希算法转换为24bit的字节;
类型序列组合子模块,用于将继承层数转换而成的字节左移24bit,加上类名转换而成的24bit字节,得到类的唯一类型序列。
其中,所述成员类标识生成模块,用于根据成员类在类中的次序将所述成员类定义为长度为16bit的字节。
其中,所述基础类型字节序列生成模块,在一种可能的实施方式中,可以包括:
基础类型唯一类型序列生成子模块,用于根据基础类型的类型名生成基础类型唯一类型序列;
基础类型成员的标识生成子模块,用于生成基础类型成员的标识,基础类型成员的标识的生成方式与类中各个成员类的标识的生成方式相同;
基础类型成员的值序列生成子模块,用于将基础类型成员的值转换为对应的字节序列。
与本申请的第二方面相应,在本申请的第四方面,提供一种反序列化装置。图5为本申请一示例性实施例示出的一种反序列化装置的框图。如图5所示,所述装置包括:
读取单元U501,用于依次读取字节流;
第一还原单元U502,与U501连接,用于读取到与类对应的开始状态标志后,依次读取单元依次读取到的字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,依次将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
第二还原单元U503,与U502和U501连接,用于读取单元读取到类中基础类状态标志后,将读取单元依次读取到的字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型的唯一标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型的唯一标识转换为基础类型的成员,以及将基础类型的成员的值序列转换为基础类型的成员的值,
类构建结束单元U504,U503和U501连接,用于在基础类型成员转换完毕之后,读取单元读取到类结束状态标志时,结束当次类的构建。
其中,所述第一还原单元,在一种可能的实施方式中,可以包括:
类名还原子单元,用于将所述唯一类型序列的后24bit位转换为类的类名;
继承层数还原子单元,用于将唯一类型序列右移24bit后和十六进制0xff求逻辑与,得到继承层数。
为了描述的方便,描述以上装置时以功能分为各种单元和模块分别描述。当然,在实施本申请时可以把各单元和模块的功能在同一个或多个软件和/或硬件中实现。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元和模块可以是或者也可以不是物理上分开的,作为单元和模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元和模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者逆序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本申请的具体实施方式,使本领域技术人员能够理解或实现本申请。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种序列化方法,其特征在于,包括:
遍历数据对象的每个类;
如果遍历到继承类或者不具有继承类的成员类,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列;
如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后,遍历具有继承类的成员类,输出与遍历到的类对应的字节序列。
2.如权利要求1所述的序列化方法,其特征在于,所述与遍历到的类对应的字节序列,包括:遍历到的类的唯一类型序列、遍历到的类中成员类的标识、基础类状态标志、遍历到的类中基础类型对应的字节序列以及与遍历到的类对应的结束状态标志;遍历到的类包括继承类、不具有继承类的成员类、具有继承类的成员类以及具有继承类的成员类的继承类;其中,遍历到的类的唯一类型序列根据遍历到的类的继承层数和类名生成。
3.如权利要求2所述的序列化方法,其特征在于,所述遍历到的类中成员类的标识根据遍历到的类中的成员类生成,所述开始状态标志、基础类状态标识和结束状态标志预先设定,所述类中基础类型对应的字节序列依次包括:预先设定的基础类型的唯一类型序列、基础类型成员的标识以及基础类型成员的值序列。
4.如权利要求2所述的序列化方法,其特征在于,根据遍历到的类的继承层数和类名生成遍历到的类的唯一类型序列,包括:
将遍历到的类的继承层数转换为8bit的字节,其中,根类的继承层数为1,每多一层继承关系所述继承层数加1;
将遍历到的类的类名使用哈希算法转换为24bit的字节;
将继承层数转换而成的字节左移24bit,加上类名转换而成的24bit字节,得到遍历到的类的唯一类型序列。
5.如权利要求2所述的序列化方法,其特征在于,所述根据遍历到的类中的成员类生成遍历到的类中成员类的标识,为根据成员类在类中的次序将成员类定义为长度为16bit的字节;基础类型成员的标识的生成方法与遍历到的类中成员类的标识的生成方法相同。
6.一种反序列化方法,其特征在于,包括:
依次读取字节流;
读取到与类对应的开始状态标志时,依次读取字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
读取到类中基础类状态标志时,依次读取字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型成员的标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型成员的标识转换为基础类型的成员,以及将基础类型成员的值序列转换为基础类型的成员的值;
读取到与类对应的结束状态标志时,结束当次类的构建。
7.如权利要求6所述的反序列化方法,其特征在于,所述将字节流中类的唯一类型序列转换为类的类名和继承层数,包括:
将所述唯一类型序列的后24bit位转换为类的类名;
将唯一类型序列右移24bit后和十六进制0xff求逻辑与,得到继承层数。
8.一种序列化装置,其特征在于,包括:
数据对象遍历单元,用于遍历数据对象的每个类;
序列化单元,用于遍历到继承类或者不具有继承类的成员类时,输出与遍历到的类对应的开始状态标志以及与遍历到的类对应的字节序列,如果遍历到具有继承类的成员类,输出与遍历到的类对应的开始状态标志,并控制数据对象遍历单元根据具有继承类的成员类的继承层次逐层遍历具有继承类的成员类的继承类后遍历具有继承类的成员类,输出与数据对象遍历单元遍历到的类对应的字节序列。
9.如权利要求8所述的序列化装置,其特征在于,所述与类对应的字节序列包括:所述类的唯一类型序列、所述类中各个成员类的标识、基础类状态标志、所述类中基础类型对应的字节序列以及与所述类对应的结束状态标志,所述类包括继承类、不具有继承类的成员类、具有继承类的成员类以及成员类的继承类。
10.一种反序列化装置,其特征在于,包括:
读取单元,用于依次读取字节流;
第一还原单元,用于读取到与类对应的开始状态标志后,依次读取单元依次读取到的字节流中所述类开始状态标志之后类的唯一类型序列、类中各个成员类的标识,将类的唯一类型序列转换为类的类名和继承层数,将类中成员类的标识转换为类的成员类;
第二还原单元,用于读取单元读取到类中基础类状态标志后,将读取单元依次读取到的字节流中所述类中基础类状态标志之后类中基础类型的唯一类型序列、所述基础类型的唯一标识、所述基础类型的成员的值序列,将类中基础类型的唯一类型序列转换为基础类型,将基础类型的唯一标识转换为基础类型的成员,以及将基础类型的成员的值序列转换为基础类型的成员的值;
类构建结束单元,用于当读取单元读取到类结束状态标志时,结束当次类的构建。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410438753.0A CN105446722B (zh) | 2014-08-29 | 2014-08-29 | 序列化方法和装置、以及反序列化方法和装置 |
PCT/CN2015/086406 WO2016029788A1 (zh) | 2014-08-29 | 2015-08-07 | 序列化方法和装置、以及反序列化方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410438753.0A CN105446722B (zh) | 2014-08-29 | 2014-08-29 | 序列化方法和装置、以及反序列化方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105446722A true CN105446722A (zh) | 2016-03-30 |
CN105446722B CN105446722B (zh) | 2019-04-02 |
Family
ID=55398736
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410438753.0A Active CN105446722B (zh) | 2014-08-29 | 2014-08-29 | 序列化方法和装置、以及反序列化方法和装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN105446722B (zh) |
WO (1) | WO2016029788A1 (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106055620A (zh) * | 2016-05-26 | 2016-10-26 | 江苏国泰新点软件有限公司 | 序列化的方法及装置 |
CN107451237A (zh) * | 2017-07-26 | 2017-12-08 | 阿里巴巴集团控股有限公司 | 序列化与反序列化方法、装置及设备 |
CN109634636A (zh) * | 2018-12-17 | 2019-04-16 | 百度在线网络技术(北京)有限公司 | 应用处理方法、装置、设备和介质 |
CN110609684A (zh) * | 2019-09-18 | 2019-12-24 | 四川长虹电器股份有限公司 | 一种在Spring boot框架下将视频转字符动画的方法 |
CN111931200A (zh) * | 2020-07-13 | 2020-11-13 | 车智互联(北京)科技有限公司 | 一种数据序列化方法、移动终端和可读存储介质 |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113138755A (zh) * | 2021-04-19 | 2021-07-20 | 上海逸动医学科技有限公司 | 一种json序列化和反序列化的优化方法及系统 |
JP7253172B2 (ja) * | 2021-04-30 | 2023-04-06 | 株式会社ソフトギア | シリアル化方法、逆シリアル化方法、情報処理プログラム、情報処理装置及び通信システム |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050097504A1 (en) * | 2001-06-29 | 2005-05-05 | Microsoft Corporation | XML serialization and deserialization |
US20090064206A1 (en) * | 2007-08-30 | 2009-03-05 | Olderdissen Jan Ra | Version-Adaptive Serialization And Deserialization |
CN101661391A (zh) * | 2009-09-24 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种对象序列化方法、对象反序列化方法、装置及系统 |
CN102193787A (zh) * | 2010-03-01 | 2011-09-21 | 深圳市金蝶中间件有限公司 | 一种序列化和反序列化的方法、装置及系统 |
CN103019689A (zh) * | 2012-11-21 | 2013-04-03 | 上海富欣智能交通控制有限公司 | 通用的对象序列化的实现方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040064825A1 (en) * | 2002-09-30 | 2004-04-01 | Timothy Lim | Method and system for object system interoperability |
CN102750268A (zh) * | 2012-06-19 | 2012-10-24 | 山东中创软件商用中间件股份有限公司 | 一种对象序列化方法、对象反序列化方法、装置及系统 |
-
2014
- 2014-08-29 CN CN201410438753.0A patent/CN105446722B/zh active Active
-
2015
- 2015-08-07 WO PCT/CN2015/086406 patent/WO2016029788A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050097504A1 (en) * | 2001-06-29 | 2005-05-05 | Microsoft Corporation | XML serialization and deserialization |
US20090064206A1 (en) * | 2007-08-30 | 2009-03-05 | Olderdissen Jan Ra | Version-Adaptive Serialization And Deserialization |
CN101661391A (zh) * | 2009-09-24 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种对象序列化方法、对象反序列化方法、装置及系统 |
CN102193787A (zh) * | 2010-03-01 | 2011-09-21 | 深圳市金蝶中间件有限公司 | 一种序列化和反序列化的方法、装置及系统 |
CN103019689A (zh) * | 2012-11-21 | 2013-04-03 | 上海富欣智能交通控制有限公司 | 通用的对象序列化的实现方法 |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106055620A (zh) * | 2016-05-26 | 2016-10-26 | 江苏国泰新点软件有限公司 | 序列化的方法及装置 |
CN107451237A (zh) * | 2017-07-26 | 2017-12-08 | 阿里巴巴集团控股有限公司 | 序列化与反序列化方法、装置及设备 |
CN107451237B (zh) * | 2017-07-26 | 2020-09-15 | 阿里巴巴集团控股有限公司 | 序列化与反序列化方法、装置及设备 |
CN109634636A (zh) * | 2018-12-17 | 2019-04-16 | 百度在线网络技术(北京)有限公司 | 应用处理方法、装置、设备和介质 |
CN109634636B (zh) * | 2018-12-17 | 2022-05-17 | 百度在线网络技术(北京)有限公司 | 应用处理方法、装置、设备和介质 |
CN110609684A (zh) * | 2019-09-18 | 2019-12-24 | 四川长虹电器股份有限公司 | 一种在Spring boot框架下将视频转字符动画的方法 |
CN110609684B (zh) * | 2019-09-18 | 2022-08-19 | 四川长虹电器股份有限公司 | 一种在Spring boot框架下将视频转字符动画的方法 |
CN111931200A (zh) * | 2020-07-13 | 2020-11-13 | 车智互联(北京)科技有限公司 | 一种数据序列化方法、移动终端和可读存储介质 |
CN111931200B (zh) * | 2020-07-13 | 2024-02-23 | 车智互联(北京)科技有限公司 | 一种数据序列化方法、移动终端和可读存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN105446722B (zh) | 2019-04-02 |
WO2016029788A1 (zh) | 2016-03-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105446722A (zh) | 序列化方法和装置、以及反序列化方法和装置 | |
CN107341262B (zh) | 数据库中对象类型列的序列化、反序列化方法及装置 | |
US7185017B1 (en) | System and method for selectively processing data sub-segments using a data mask | |
CN110309196A (zh) | 区块链数据存储和查询方法、装置、设备及存储介质 | |
CN111741019A (zh) | 一种基于字段描述的通信协议解析方法和系统 | |
CN104035754A (zh) | 一种基于xml的自定义代码生成方法及生成器 | |
CN105677683A (zh) | 批量数据查询方法和装置 | |
CN112068817A (zh) | 物联网终端侧的代码生成方法、系统、装置及介质 | |
US9639331B2 (en) | Service interface creation and modification for object-oriented services | |
CN102981882A (zh) | 解析方法和装置 | |
CN115469941A (zh) | 基于FlinkSQL的风控指标计算开发的自动配置处理方法及系统 | |
CN105279269A (zh) | 一种支持表自由关联的sql生成方法和系统 | |
CN114138997A (zh) | 具有数字孪生和基于图形的结构的计算机实现的系统和方法 | |
CN115994141A (zh) | 一种树形编码方法及系统 | |
CN104281604B (zh) | 生成Targetlink数据字典分层树的方法和系统 | |
CN107766519B (zh) | 一种可视化配置数据结构的方法 | |
CN116521921B (zh) | 一种三维可视化场景下数据模型的配置及查询方法 | |
CN117851375A (zh) | 元数据模型优化方法和计算设备 | |
CN117033855A (zh) | 滤波掩码生成方法、装置、电子设备及存储介质 | |
JP2004252973A (ja) | 客体指向プログラムが記録された貯蔵媒体 | |
CN116450110A (zh) | 基于自定义属性的数据库的访问代码自动生成方法及系统 | |
CN111752954B (zh) | 一种大规模特征数据存储的方法及装置 | |
CN114048352A (zh) | Xml文件转换不定长结构体的方法 | |
CN113269530A (zh) | 反向生成wbs结构及工程造价汇总的方法、装置和设备 | |
US8144730B2 (en) | Automated tactical datalink translator |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20200527 Address after: 310051 room 508, floor 5, building 4, No. 699, Wangshang Road, Changhe street, Binjiang District, Hangzhou City, Zhejiang Province Patentee after: Alibaba (China) Co.,Ltd. Address before: 100083, No. 28, Fu Cheng Road, 12, Beijing, Haidian District Patentee before: UC MOBILE Ltd. |