发明内容
为克服相关技术中存在的问题,本说明书提供了数据序列化、数据反序列方法、装置及设备。
根据本说明书实施例的第一方面,提供一种数据序列化方法,所述方法包括:
针对待序列化的对象数据,获取所述对象数据中待序列化对象的类型;
将所述对象数据序列化为包含有附加数据的JSON格式数据,所述附加数据表征所述待序列对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型。
可选的,所述待序列化对象的类型包括:除了编程语言内置类型之外的其他类型。
可选的,所述目标标识与所述对象数据中的属性名不同。
可选的,所述目标标识的首个字符为下划线。
可选的,所述JSON格式数据通过如下方式获得:
将所述对象数据和所述附加数据分别按照JSON协议进行序列化后,将所述附加数据的序列化结果添加至所述对象数据的序列化结果中,获得所述JSON格式数据;或,
为所述待序列化对象新增所述附加属性,将新增所述附加属性后的对象数据序列化为所述JSON格式数据。
根据本说明书实施例的第二方面,提供一种数据反序列方法,包括:
获取待反序列化的JSON格式数据;其中,所述JSON格式数据包含有附加数据,所述附加数据表征对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型;
将所述JSON格式数据进行反序列化,获得对象数据并输出,其中,对象的类型通过如下方式获得:从所述JSON格式数据中识别到包括目标标识的属性名后,从对应所述属性名的属性值中获取得到。
根据本说明书实施例的第三方面,提供一种数据序列化装置,包括:
类型获取模块,用于:针对待序列化的对象数据,获取所述对象数据中待序列化对象的类型;
序列化模块,用于:将所述对象数据序列化为JSON格式数据,其中,所述JSON格式数据包含有附加数据,所述附加数据表征所述待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型。
可选的,所述待序列化对象的类型包括:除了编程语言内置类型之外的其他类型。
可选的,所述目标标识与所述对象数据中的属性名不同。
可选的,所述目标标识的首个字符为下划线。
可选的,所述序列化模块,还用于:
将所述对象数据和所述附加数据分别按照JSON协议进行序列化后,将所述附加数据的序列化结果添加至所述对象数据的序列化结果中,获得所述JSON格式数据;或,
为所述待序列化对象新增所述附加属性,将新增所述附加属性后的对象数据序列化为所述JSON格式数据。
根据本说明书实施例的第四方面,提供一种数据反序列装置,包括:
数据获取模块,用于:获取待反序列化的JSON格式数据;其中,所述JSON格式数据包含有附加数据,所述附加数据表征对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型;
反序列化模块,用于:将所述JSON格式数据进行反序列化,获得对象数据并输出,其中,对象的类型通过如下方式获得:从所述JSON格式数据中识别到包括目标标识的属性名后,从对应所述属性名的属性值中获取得到。
根据本说明书实施例的第五方面,提供一种数据序列化设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现如下方法:
针对待序列化的对象数据,获取所述对象数据中待序列化对象的类型;
将所述对象数据序列化为包含有附加数据的JSON格式数据,所述附加数据表征所述待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型。
根据本说明书实施例的第六方面,提供一种数据反序列化设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现如下方法:
获取待反序列化的JSON格式数据;其中,所述JSON格式数据包含有附加数据,所述附加数据表征对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型;
将所述JSON格式数据进行反序列化,获得对象数据并输出,其中,对象的类型通过如下方式获得:从所述JSON格式数据中识别到包括目标标识的属性名后,从对应所述属性名的属性值中获取得到。
本说明书的实施例提供的技术方案可以包括以下有益效果:
在序列化过程中,本说明书实施例可以获取待序列化对象的类型,并使对象数据序列化所得的JSON格式数据中包含有附加数据,利用该附加数据表征所述待序列化对象具有附加属性,附加属性的属性名包括目标标识,附加属性的属性值包括所述类型,基于此,序列化结果中包含了待序列化对象的类型,因此在反序列化过程中,可以通过识别目标标识获取到对象的类型,从而可以防止类型信息丢失造成的反序列化失败。该方案不会丢失类型信息,并且遵循JSON格式,可以兼容已有JSON协议,可以方便、无侵入地应用于需要JSON序列化的场景中。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本说明书。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书的一些方面相一致的装置和方法的例子。
在本说明书使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书。在本说明书和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
计算机程序中,为了将内存中的对象存储到磁盘或发送到网络中,需要将对象数据先转换成一种可存储或发送的数据格式,这种转换过程叫做序列化;反之,将符合一定规范的数据还原成内存对象数据的过程叫做反序列化。主流的序列化技术包括可扩展标记语言XML(Extensible Markup Language)技术和JSON(JavaScript Object Notation)技术等。
其中,XML是指可扩展标记语言,广泛用于描述结构化的数据,常被用作数据的序列化。JSON是一种轻量级的数据交换/序列化格式;该格式不仅适合机器的读取和写入,也适合人类阅读甚至手工编辑;它的格式实际上取自Javascript编程语言的对象字面量的表示这一语法子集;JSON格式与具体编程语言无关,在Java、c、c++、python等等绝大多数编程语言中均有工具实现;这使得JSON成为一种理想的数据交换/序列化格式。
JSON格式在许多领域、许多技术平台的应用中都被用作为实体对象的序列化形式,对象的序列化结果即为JSON格式数据,该JSON格式数据是一个由对象中各属性的“key(属性名)-value(属性值)”对所构成的字符串集合,以左大括号“{”开始,以右大括号“}”结束。属性名和字符类型的属性值均需要用双引号括起来,数组类型的属性值则用中括号“[”括起来,JSON类型的属性值需要用大括号“{}”括起来。属性名和属性值之间使用冒号“:”分隔,各“属性名-属性值”对之间使用逗号“,”分隔。作为例子,属性int age=20的序列化结果为{“age”:20},可以看出,序列化结果包括属性名age,属性值的序列化结果18,分隔符为冒号“:”,标识符包括大括号“{}”和标识符双引号““””。
由此可知,JSON序列化协议本身并未定义数据类型的记录形式,这在涉及多态或自定义数据类型时可能会出现反序列化失败的情况。
多态是面向对象编程语言的一种特性,即在一个父类或父接口中定义一个方法,在其所有具体子类型中均各自实现了该方法且具体行为可以各不相同;在调用该方法时,以父类/父接口的引用去进行调用,调用程序层面不用关心当前引用指向的对象类型具体是哪种子类,执行期会自动表现出真正的具体子类型应有的行为;这种特性使得面向对象编程语言编写的程序可维护性较高,适合编写大型程序。
当被序列化的对象中含有应用了多态特性的属性时,虽然该对象可以被正确地序列化为JSON格式数据,但却由于JSON序列化协议本身并未定义多态情形下对象类型的记录形式,进而在反序列化时无法为这个应用了多态特性的属性找到精确的类型信息,也就是说,因为JSON序列化协议没有关注类型的记录,因此在序列化过程中丢失了类型信息,最终导致反序列化失败。
结合图1A和图1B对涉及多态性的对象进行说明,Outer是一个普通的Java类型,该类中拥有2个属性:name和inner;其中name属性是String型,inner属性的类型是接口类型,属于父类型,inner接口类型拥有2个自定义的子类:InnerImpl1和InnerImpl2,也就是说,inner属性的类型有两种InnerImpl1和InnerImpl2。InnerImpl1和InnerImpl2中各有一个String类型的name属性。
由于JSON序列化协议未定义类型,一个Outer类型的对象被传统的JSON序列化后得到的结果为:{"inner":{"name":"Inner2"},"name":"Outer"},注意,这里已经丢失了内部属性"inner"的类型信息;之后再对这个字符串做反序列化时,因为上一步得到的JSON字符串不含有inner属性的具体类型(实际上应该是InnerImpl2类型),因此造成对inner属性的反序列化失败的情况。
基于此,本说明书实施例提供了一种数据序列化和反序列化方案,在序列化过程中,本说明书实施例通过获取待序列化对象的类型,并使对象数据序列化所得的JSON格式数据中包含有附加数据,利用该附加数据表征所述待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型,基于此,序列化结果中包含了待序列化对象的类型,因此在反序列化过程中,可以通过识别目标标识获取到对象的类型,从而可以防止类型信息丢失造成的反序列化失败。该方案不会丢失类型信息,并且遵循JSON格式,可以兼容JSON协议,可以方便、无侵入地应用于需要JSON序列化的场景中。接下来进行详细说明。
如图2A所示,是本说明书根据一示例性实施例示出的一种数据序列化方法的流程图,包括如下步骤:
在步骤202中,针对待序列化的对象数据,获取所述对象数据中待序列化对象的类型。
在步骤204中,将所述对象数据序列化为包含有附加数据的JSON格式数据,所述附加数据表征所述待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型。
本实施例的数据序列化方法可应用于多种编译语言描述的对象数据,对象数据中包括一个或多个待序列化对象,待序列化对象在组成结构上可以理解为一个或多个属性组成,属性包括属性名、类型和属性值。
仍以图1A和图1B为例,Outter是一个普通的Java类型,该类中拥有2个属性:name和inner;其中name属性是String型,inner属性的类型是接口类型,inner属于父类型,inner接口类型拥有2个自定义的子类:InnerImpl1和InnerImpl2,也就是说,inner属性的类型有两种InnerImpl1和InnerImpl2。InnerImpl1和InnerImpl2中各有一个String类型的name属性。
为了令JSON格式数据中可以指示对象的类型,本实施例中的JSON格式数据包含有附加数据,所述附加数据表征对象具有附加属性,该附加属性的属性值包括所述类型,而属性名包括目标标识,该目标标识可以根据需要灵活配置。作为例子,可以附加数据表征inner新增了一附加属性“_clazz属性”,该属性的属性名为"_clazz",属性值为inner属性的类型:InnerImpl2。其中,为了便于识别、防止与其他属性名冲突,本说明书实施例中,目标标识可以与所述对象数据中的字符串不同;作为例子,可以采用一固定的不常见的字符串作为目标标识。例如,实际应用中,属性名较少采用下划线作为首字符,因此,本实施例的目标标识的首个字符可以是下划线。
本实施例可以是识别对象数据中所有待序列化对象的类型,并针对对象数据中的所有对象新增附加属性,以标识每个对象的类型;在另一些例子中,也可以是针对部分对象新增附加属性,以标识每个对象的类型,例如具有自定义类型的对象、具有多态性的对象等,此类对象的类型可以是具有除了编程语言内置类型之外的其他类型,因为内置类型不会有子类,因此可以无需对这些类型进行类型标注。以Java语言为例,内置类型可以包括:BigDecimal、BigInteger、boolean、Boolean、byte、Byte、Character、double、Double、float、Float、int、Integer、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Date、long、Long、shortShort或String等。当然,上述示例以Java语言为例,对于采用其他编程语言的对象数据,可以根据实际编程语言的内置类型而灵活配置。
以图1A所示的outter类型的对象数据,可以被本说明书实施例的方法序列化为如下JSON格式数据:
{"inner":{"_clazz":"InnerImpl2","name":"Inner2"},"name":"Outer"}
本实施例中,JSON格式数据包含有附加数据:"_clazz":"InnerImpl2",该附加数据表征了对象具有一附加属性:_clazz属性,该属性的属性名为"_clazz",属性值为inner属性的类型:InnerImpl2;因此可以在序列化结果中标注被序列化对象的类型,成功防止了类型信息丢失的问题,并且遵循JSON协议,能够与传统的JSON协议相兼容,实施成本很小,具体实现时可以从协议层面兼容,无需业务系统做额外准备或更改。
在另一些例子,基于不同编程语言的要求,本领域技术人员可以对序列化过程进行灵活调整。如图2B所示,是本说明书根据一示例性实施例示出的对一Outter类型的对象数据的序列化过程,使用同样结构的Outer类型的对象数据,可以被序列化为如下JSON格式的字符串:
{"_clazz":"tson.Outter","inner":{"_clazz":"tson.InnerImpl2","name":"Inner2"},"name":"Outter"}
其中,JSON字符串中的:
"inner":{"_clazz":"tson.InnerImpl2","name":"Inner2"},"采用目标标识"_clazz"表征对象"inner"具有一附加属性。其中,本实施例以Java语言为例,基于Java语言的规范,还在类型“InnerImpl2”之前添加了该对象所在的包名,在对象"inner"之前,也采用"tson.Outter"表征该包名的全量路径,表示Outter这个类被管理于tson包中。当然,实际应用中可以根据其他编程语言的规范对序列化过程进行灵活调整,本实施例对此不作限定。
可选的,本实施例中将所述对象数据序列化为包含有附加数据的JSON格式数据可以有多种方式实现,作为例子,可以是在对象数据序列化后添加,具体的,一方面待序列化的对象数据按照JSON协议序列化后获得序列化结果(称为DATA1),另一方面将附加数据按照JSON协议序列化后获得序列化结果,也即是将附加属性的属性名和属性值按照JSON协议序列化(称为DATA2,即附加数据),将DATA2添加至DATA1中得到DATA3,DATA3即步骤204中的包含有附加数据的JSON格式数据。
当然,本说明书实施例也不排除其他实现方式,例如,也可以是为对象配置该附加属性后再统一进行序列化,具体的,可以是为所述待序列化对象新增所述附加属性,将新增所述附加属性后的对象数据序列化为所述JSON格式数据,从而直接获得包含有附加数据的JSON格式数据。
通过上述方案对对象数据序列化获得的JSON格式数据,本说明书实施例还提供了一种数据反序列化方法,如图3所示,包括如下步骤:
在步骤302中,获取待反序列化的JSON格式数据;其中,所述JSON格式数据包含有附加数据,所述附加数据表征待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型;
在步骤302中,将所述JSON格式数据进行反序列化,获得对象数据并输出,其中,对象的类型通过如下方式获得:从所述JSON格式数据中识别到包括目标标识的属性名后,从对应所述属性名的属性值中获取得到。
基于图2B所示实施例获得的JSON格式数据,其中采用目标标识标注了附加属性,因此,识别到包括目标标识的属性名后,则可以从对应所述属性名的属性值中获取得到数据类型。例如,针对{"inner":{"_clazz":"InnerImpl2","name":"Inner2"},"name":"Outer"},由于识别到以目标标识“_clazz”为属性名的附加属性,因此可以获取到对应所述属性名的属性值"InnerImpl2",该"InnerImpl2"表征了对象"inner"的类型。因此,本说明书实施例可以在反序列化过程中准确地获取到对象的类型,从而可以减少反序列化失败的情况。
本申请通过扩展原有JSON协议,创造出带_clazz属性的新协议,用于在序列化文本中标注被序列化对象的精确类型,成功解决了传统JSON反序列化无法正确处理多态属性的问题;且实施成本很小,方案直接从协议层面兼容,无需业务系统做额外准备或更改。
与前述数据序列化方法/数据反序列化的实施例相对应,本说明书还提供了数据序列化装置/数据反序列装置及其所应用的设备的实施例。
本说明书数据序列化装置/数据反序列装置的实施例可以应用在计算机设备上,例如服务器或终端设备。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在数据序列化/数据反序列的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图4所示,为本说明书实施例数据序列化装置/数据反序列装置所在设备的一种硬件结构图,除了图4所示的处理器410、内存430、网络接口420、以及非易失性存储器440之外,实施例中装置431所在的服务器或终端设备,通常根据该设备的实际功能,还可以包括其他硬件,对此不再赘述。
如图5所示,图5是本说明书根据一示例性实施例示出的一种数据序列化装置的框图,所述数据序列化装置包括:
类型获取模块51,用于:针对待序列化的对象数据,获取所述对象数据中待序列化对象的类型;
序列化模块52,用于:将所述对象数据序列化为包含有附加数据的JSON格式数据,所述附加数据表征所述待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型。
可选的,所述待序列化对象的类型包括:除了编程语言内置类型之外的其他类型。
可选的,所述目标标识与所述对象数据中的属性名不同。
可选的,所述目标标识的首个字符为下划线。
可选的,所述序列化模块,还用于:
将所述对象数据和所述附加数据分别按照JSON协议进行序列化后,将所述附加数据的序列化结果添加至所述对象数据的序列化结果中,获得所述JSON格式数据;或,
为所述待序列化对象新增所述附加属性,将新增所述附加属性后的对象数据序列化为所述JSON格式数据。
如图6所示,图6是本说明书根据一示例性实施例示出的一种数据反序列装置的框图,包括:
数据获取模块61,用于:获取待反序列化的JSON格式数据;其中,所述JSON格式数据包含有附加数据,所述附加数据表征待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型;
反序列化模块62,用于:将所述JSON格式数据进行反序列化,获得对象数据并输出,其中,对象的类型通过如下方式获得:从所述JSON格式数据识别到包括目标标识的属性名后,从对应所述属性名的属性值中获取得到。
相应的,本说明书还提供一种数据序列化设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现如下方法:
针对待序列化的对象数据,获取所述对象数据中待序列化对象的类型;
将所述对象数据序列化为包含有附加数据的JSON格式数据,所述附加数据表征所述待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型。
相应的,本说明书还提供一种数据反序列化设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,所述处理器执行所述程序时实现如下方法:
获取待反序列化的JSON格式数据;其中,所述JSON格式数据包含有附加数据,所述附加数据表征待序列化对象具有附加属性,所述附加属性的属性名包括目标标识,所述附加属性的属性值包括所述类型;
将所述JSON格式数据进行反序列化,获得对象数据并输出,其中,对象的类型通过如下方式获得:从所述JSON格式数据中识别到包括目标标识的属性名后,从对应所述属性名的属性值中获取得到。
上述数据序列化装置/数据反序列装置中各个模块的功能和作用的实现过程具体详见上述数据序列化方法/数据反序列方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域技术人员在考虑说明书及实践这里申请的发明后,将容易想到本说明书的其它实施方案。本说明书旨在涵盖本说明书的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本说明书的一般性原理并包括本说明书未申请的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本说明书的真正范围和精神由下面的权利要求指出。
应当理解的是,本说明书并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本说明书的范围仅由所附的权利要求来限制。
以上所述仅为本说明书的较佳实施例而已,并不用以限制本说明书,凡在本说明书的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书保护的范围之内。