CN109117209B - 序列化和反序列化方法及装置 - Google Patents
序列化和反序列化方法及装置 Download PDFInfo
- Publication number
- CN109117209B CN109117209B CN201810810008.2A CN201810810008A CN109117209B CN 109117209 B CN109117209 B CN 109117209B CN 201810810008 A CN201810810008 A CN 201810810008A CN 109117209 B CN109117209 B CN 109117209B
- Authority
- CN
- China
- Prior art keywords
- unique identifier
- type
- preset
- serialization
- serializing
- 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.)
- Active
Links
Images
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
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/4493—Object persistence
-
- 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30076—Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
- G06F9/30087—Synchronisation or serialisation instructions
Abstract
本发明公开了一种序列化和反序列化方法,包括:响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。本发明能有效解决现有序列化技术只能对树状数据进行序列化的问题,实现对图状数据进行自动序列化。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种序列化和反序列化方法及装置。
背景技术
数据序列化技术广泛应用于各种数据交互场景。例如,网络传输,数据存储,配置文件的读写等。不同序列化技术的应用场景也有所区别,现有技术中的序列化方法可主要有以下几种类型:
1.json序列化:该技术调用一个函数就可以直接序列化一个结构体A。该技术采用反射的方法,遍历结构体A的所有字段,并进行序列化。优点是不用定义额外的数据结构体B就可以自动的序列化。缺点是由于采用反射实现,速度慢,并且只能序列化公有字段(私有字段是不能被反射代码访问的)。另外,json是明文,序列化数据量较大。该技术比较适合与数据文件的读写以及编辑器之间传递文件或数据等对于性能要求不高的地方。
2.protobuf序列化:该技术定义了一种描述文件,用于描述结构体的结构。假设我们需要序列化结构体A,我们首先需要写好描述文件,用于描述结构体A,并用protobuf工具生成该描述文件对应的.go文件。生成的go代码中会包含一个结构体B。我们需要手工将待序列化的结构体A的字段一一赋值到结构体B之中。该技术的优点是速度快,并且兼容性好,缺点是需要手写序列化代码。该技术比较适合于网络传输以及数据存储等对于性能和兼容性要求都比较高的地方。
3.gob序列化:该方案是go语言中为了提高速度以及序列化能力所实现的特殊的序列化解决方案。该方案同样采用反射实现,特点是可以比json序列化的类型更多,可以序列化interface字段(任意类型),并且序列化数据量较小缺点是序列化interface时需要手动注册每个可能对interface进行赋值的结构体,并且也只能序列化公有字段。
除了上述序列化技术,还有其他一些序列化技术,但和上面几种技术并无太大差别。这些技术各有所长,但共同点是都只能对树状数据进行序列化。下面,将对本发明涉及到几个概念进行介绍。
go语言代码和c语言代码的最大区别仅仅是go语言的类型名是在变量名后面,例如:type A struct{field int}。上述代码定义结构体A,结构体A包含一个类型为int,名字为field的字段。
计算机领域内树和图的概念广泛存在。树是一种包含结构,节点之间是父子关系,只有父子之间有连线。而图这种结构任意节点之间都可能有连线。这里的数据树和数据图也是类似的概念。例如图1(a)所示的树状结构(数据树),用go代码表示如下:
type A struct {
field1 B
field2 C
}
type B struct {
field int
}
type C struct {
field int
}
结构体A是数据树的根,现有的序列化技术都可以序列化结构体A。
如图1(b)所示的图状结构(数据图),用go代码表示如下:
type A struct {
field1 B
field2 C
}
type B struct {
field *int
}
type C struct {
field *int
}
其中当B和C的field共享一个int指针的时候,就构成了数据图。这种情况,现有技术虽然可以将结构体A序列化得到字节流,但是却无法正确的将A从字节流中反序列化出来。因为反序列化出来得到的B.field和C.field是两个int指针,而原来结构体A是可能共享int指针的。因此现有技术是不能处理这种情况的。
另一个例子如图1(c)所示,go代码表示如下:
type A struct {
child *B
}
type B struct {
parent *A
}
这种情况,A和B相互引用,现有技术是完全不能处理的。
本文所描述的技术能序列化数据图,并将数据图正确的按原有结构反序列化出来,这是其他所有序列化技术所不具备的特点。
发明内容
本发明实施例的目的是提供一种序列化和反序列化方法及装置,能有效解决现有序列化技术只能对树状数据进行序列化的问题,实现对图状数据进行自动序列化。
为实现上述目的,本发明实施例提供了一种序列化和反序列化方法,包括:
响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;
响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。
与现有技术相比,本发明公开的序列化和反序列化方法通过预设唯一标识符对预设类型的数据进行序列化,且当读出唯一标识符时,根据所述唯一标识符对相应类型的字段进行反序列化,使得该唯一标识符与特定类型的数据唯一映射,则在序列化过程中无需多次序列化同一对象,能有效解决现有序列化技术只能对树状数据进行序列化的问题,实现对图状数据进行自动序列化。
作为上述方案的改进,根据预设的第一规则对不同类型的对象进行序列化前还包括步骤:
对所述所有源代码所应用的所有类型进行筛选,去除函数类型和channel类型的对象。
作为上述方案的改进,所述根据预设的第一规则对不同类型的对象进行序列化具体包括:
当所述对象为固定字节大小的基础类型时,根据预设的编码进行序列化;
当所述对象为不定字节大小的基础类型时,先序列化该对象的长度,再序列化该对象的内容;
当所述对象为结构体类型时,调用预设的第一序列化函数进行序列化;
当所述对象为数组类型时,遍历该数组并对该数组内的每一元素进行序列化。
作为上述方案的改进,所述根据预设的第二规则反序列化不同类型的字段具体包括:
当判断待反序列化的字段为固定字节大小的基础类型时,根据预设的编码进行反序列化;
当判断待反序列化的字段为不定字节大小的基础类型时,先读出该基础类型的长度,再根据该基础类型的长度读出相应的内容;
当判断待反序列化的字段为结构体类型时,调用预设的第一反序列化函数进行序列化;
当判断待反序列化的字段为数组类型时,待反序列化的字段内的每一元素进行反序列化。
作为上述方案的改进,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化具体包括:
当所述对象为指针类型时,判断预设的集合内是否存在该指针,当所述集合内不存在该指针时,生成该指针的唯一标识符,序列化所述唯一标识符和该指针指向的类型;当所述集合内存在该指针时,序列化该指针所对应的唯一标识符;
当所述对象为slice类型时,判断预设的集合内是否存在该slice,当所述集合内不存在该slice时,序列化所述唯一标识符和该slice的长度;当所述集合内存在该slice时,序列化该slice所对应的唯一标识符;
当所述对象为map类型时,判断预设的集合内是否存在该map,当所述集合内不存在该map时,序列化所述唯一标识符、该map的长度和该map中的每一元素;当所述集合内存在该map时,序列化该map所对应的唯一标识符;
当所述对象为interface类型时,根据预设的第二序列化函数对该interface的类型进行判断,基于所述interface的类型对该interface对应的唯一标识符和该interface对应的值进行序列化。
作为上述方案的改进,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化具体包括:
当待反序列化的字段为数组类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的指针加入所述集合中,并对该指针指向的类型进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的指针赋值至当前字段;
当待反序列化的字段为slice类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的slice加入所述集合中,并对该slice的长度进行反序列化,根据该slice的长度对该slice的每一元素进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的slice赋值至当前字段;
当待反序列化的字段为map类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的map加入所述集合中,并对该map的长度进行反序列化,根据该slice的长度对该map的每一元素进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的map赋值至当前字段;
当待反序列化的字段为interface类型时,通过第二反序列化函数读出唯一标识符,根据所述唯一标识符调用相应的反序列化代码,根据所述反序列化代码对interface的值进行反序列化。
作为上述方案的改进,所述遍历预设工程内的所有源代码,分析所述源代码内所有对象的类型具体包括步骤:
通过预设的标准库,构建源代码的抽象语法树;
分析所述抽象语法树,得到源代码内所有对象的类型。
作为上述方案的改进,所述方法适用于go语言。
作为上述方案的改进,当所述源代码为结构体类型时,且该结构体内包括第三方类型时,在所述序列化函数中生成第一函数调用对所述第三方类型进行序列化;
当判断待反序列化的字段为结构体类型,且该结构体内包括第三方类型时,在所述反序列化函数中生成第二函数调用对所述第三方类型进行反序列化。
作为上述方案的改进,根据预设的第一规则对不同类型的对象进行序列化之前还包括步骤:
在工程的每一个包内生成标准文件,所述标准文件包括相应的包内所有结构体的序列化函数和反序列化函数,所述标准文件还包括相应的包内所有类型组合形成的interface的序列化函数和反序列化函数。
本发明实施例还提供了一种序列化和反序列化装置,包括:
序列化模块,用于响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;
反序列化模块,用于响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。
附图说明
图1(a)、图1(b)和图1(c)分别是三种不同的数据结构图。
图2是本发明实施例中一种序列化和反序列化方法的流程示意图。
图3是本发明实施例中一种序列化和反序列化装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参见图2,是本发明实施例1提供的一种序列化和反序列化方法的流程示意图,包括步骤:
S1、响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;
S2、响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。
本发明的核心是对源代码进行静态分析,由于go语言本身设计上比较简单,且高度结构化,使得这一关键分析相对容易,在本发明实施例中优选适用于go语言进行说明。
在步骤S1中,所述遍历预设工程内的所有源代码,分析所述源代码内所有对象的类型具体包括步骤:
S11、通过预设标准库,构建源代码的抽象语法树;
其中,所述标准库优选为go/ast或go/parser标准库。
S12、分析所述抽象语法树,得到源代码内所有对象的类型。
而在步骤S12中,优选通过go/types标准库分析抽象语法树。
此外,由于函数类型和channel类型不能序列化,则步骤S1中,根据预设的第一规则对不同类型的对象进行序列化前还包括步骤:
对所述源代码中所有对象的类型进行筛选,去除函数类型和channel类型的对象。
进一步地,步骤S1中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化具体包括:
S111、当所述源代码为指针类型时,判断预设的集合内是否存在该指针,当所述集合内不存在该指针时,生成该指针的唯一标识符,序列化所述唯一标识符和该指针指向的类型;当所述集合内存在该指针时,序列化该指针所对应的唯一标识符;
S112、当所述源代码为slice类型时,判断预设的集合内是否存在该slice,当所述集合内不存在该slice时,序列化所述唯一标识符和该slice的长度;当所述集合内存在该slice时,序列化该slice所对应的唯一标识符;
S113、当所述源代码为map类型时,判断预设的集合内是否存在该map,当所述集合内不存在该map时,序列化所述唯一标识符、该map的长度和该map中的每一元素;当所述集合内存在该map时,序列化该map所对应的唯一标识符;
S114、当所述对象为interface类型时,根据预设的第二序列化函数对该interface的类型进行判断,基于所述interface的类型对该interface对应的唯一标识符和该interface对应的值进行序列化。
通过上述方式,通过为预设类型的数据设置唯一标识符,可解决现有技术无法对图状数据无法进行序列化的问题,实现对图状数据和树状数据自动化序列。需要说明的是,go语言中的interface类型表示任意的类型。例如
type A struct {
field interface{}
}
其中field是interface类型,表示任意类型的数据都可以对其进行赋值。现有技术对interface序列化的支持并不好。json可以序列化结构体A,但是反序列化出来却是一个map,而不是正确的类型。protobuf没有interface的描述,不能序列化interface。gob可以序列化interface,但需要手动为每个可能赋值给interface的具体类型进行注册。这无疑算是一个进步。但结构体如果只被少量地方引用还好办,里面的interface可能只包含有限的几种类型。而对于一些公共结构,被大量代码引用,里面的interface可能有非常多的类型,并且代码是不断变化的,interface对应的类型也是不断变化的,以至于我们要把可能需要注册的类型全部注册是一件非常麻烦,且不可维护的事情。而本发明实施例通过扫描所有类型并自动生成带interface类型的结构体的序列化代码,达到了类似给gob自动注册了所有类型相同的效果,不需要维护注册哪些类型。因此,本发明实现了自动序列化interface。当所述源代码为interface类型时,在步骤S1中统计了代码中所引用的所有类型,则可对每个类型分配一个唯一标识符。当需要进行序列化时,先判断该interface所属的类型,再对该interface所属类型相对应的唯一标识符和其具体的值进行序列化。而在实际应用中,可设置3个辅助映射来代替类型比较,从而加速了interface的序列化。例如,映射A保存(类型,序列化代码),映射B保存(类型,唯一标识符),映射C保存(唯一标识符,反序列化代码)。序列化和反序列化时可以直接从映射中查找,而不必一一判断,实现对interface类型的数据类型进行自动序列化。需要说明的是,但存在一结构体A需要被序列化时,自动序列化是指仅需对结构体A直接调用一个函数,不需要手工写序列化代码。相反,手动序列化是需要对结构体A的每个字段写序列化代码,当结构体A发生变化时,还需要维护相应的序列化代码。现有技术一般采用反射或者生成代码两种方式来实现序列化。其中,采用反射的技术可以扫描每个字段,因此可以实现自动序列化。而对于采用生成代码的方式,由于其不支持数据图、interface等结构,一般都会生成一个不包含数据图和interface的额外的结构体B的序列化代码,需要手工写代码来将结构体A的数据存储到结构体B中,然后序列化结构体B。而本发明可直接生成结构体A的序列化代码,不需要手工代码,实现自动序列化进程。
相应地,在步骤S2中,当读出唯一标识符时,根据所述唯一标识符对相应的类型的字段进行反序列化具体包括:
S211、当待反序列化的字段为数组类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的指针加入所述集合中,并对该指针指向的类型进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的指针赋值至当前字段;
S212、当待反序列化的字段为slice类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的slice加入所述集合中,并对该slice的长度进行反序列化,根据该slice的长度对该slice的每一元素进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的slice赋值至当前字段;
S213、当待反序列化的字段为map类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的map加入所述集合中,并对该map的长度进行反序列化,根据该slice的长度对该map的每一元素进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的map赋值至当前字段;
S214、当待反序列化的字段为interface类型时,通过第二反序列化函数读出唯一标识符,根据所述唯一标识符调用相应的反序列化代码,根据所述反序列化代码对interface的值进行反序列化。
而对于其他类型的序列化,具体操作如下:
当所述对象为固定字节大小的基础类型时,根据预设的编码进行序列化;
当所述对象为不定字节大小的基础类型时,先序列化该对象的长度,再序列化该对象的内容;
当所述对象为结构体类型时,调用预设的第一序列化函数进行序列化;
当所述对象为数组类型时,遍历该数组并对该数组内的每一元素进行序列化。
另一方面,其他类型的反序列化的具体操作如下:
当判断待反序列化的字段为固定字节大小的基础类型时,根据预设的编码进行反序列化;
当判断待反序列化的字段为不定字节大小的基础类型时,先读出该基础类型的长度,再根据该基础类型的长度读出相应的内容;
当判断待反序列化的字段为结构体类型时,调用预设的第一反序列化函数进行序列化;
当判断待反序列化的字段为数组类型时,待反序列化的字段内的每一元素进行反序列化。
在步骤S1中,遍历过程中,不同路径下的包可能有相同的名字。例如在同一个文件中,与import同名的包需要作出区分。本发明实施例定义了一个计数器,当有重名的包出现时,计数器加一,并根据计数器生成新的别名。import以及后面的引用都采用这个别名。
例如:
import actions "xcore/xbehavior/actions"
import actions1 "bs/bot/behavior/actions"
此外,由于本发明实施例统计了所有类型以及其所在的包,如果某个类型不属于已知的包,那么就属于第三方库中的包(包括标准库)。如果结构体中包含了第三方库中的类型,那么发明实施例将在结构体的序列化函数中生成第一函数调用来序列化第三方类型,同时在反序列化函数中生成第二函数调用来反序列化第三方类型,而这两个函数需要手工填写内容。
需要说明的是,一个应用往往包含了多个工程,每个工程又包含了多个包。go语言的包是及其严格的划分,变量、结构体、函数等的公有和私有都是在包这一层面讲的。现有技术对于私有字段的序列化支持并不好。能自动序列化的技术例如json,一般都通过反射来实现,不能序列化私有字段。而protobuf等技术生成的结构体B都只包含公有字段,只能手写序列化代码来序列化结构体A的私有字段。而本发明通过在包(package)内自动生成代码的方式,实现了自动序列化私有字段。优选地,本发明实施例采用如下方法来处理和包相关的问题。分析以包为单位,在每个包内生成一个.go文件的标准文件,其中包含两个内容:
包内定义的所有结构体的序列化函数和反序列化函数;
包内使用到的所有类型组合形成的interface序列化函数和反序列化函数。
同时,对每个应用,生成一个单独的包用于存放整个应用的interface序列化函数和反序列化函数。整个应用的interface序列化函数和反序列化函数是其中所有工程的所有包的interface序列化函数和反序列化函数的一个组合。应用的interface序列化函数和反序列化函数都是独一无二的。
本发明实施例提供的序列化和反序列化方法可应用于多个方面,下面仅列举两个例子做一个简单的说明。
当内部的一个编辑器应用需要一个复杂的数据结构时,编辑器需要读取该数据结构。但编辑器是在其他线程甚至其他进程进行操作的,不能影响原有的结构。因此,通过将结构进行序列化然后反序列化的方式,就克隆出来一个和原来的结构完全一样的数据结构,编辑器然后在该克隆结构上面进行操作就对原来的结构完全没有影响。由于要处理的结构非常复杂,里面包含了大量的interface,按照现有的序列化技术是很难处理的,而采用本发明的序列化技术则非常简单,自动生成代码后,调用两个函数(序列化函数和反序列化函数)即可实现;
当项目内存在代码热更新框架时,本发明的序列化充当了基础技术的角色。序列化模块将进程中所有的动态数据传递出去,并在另外一个进程中将其还原出来,实现整个进程级别的复杂数据序列化。
参见图3,是本发明实施例2提供的一种序列化和反序列化装置的结构示意图,包括:
序列化模块101,用于响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;
反序列化模块102,用于响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。
本发明实施例的工作原理和实施过程可参考上述对序列化和反序列化方法的具体描述,在此不再赘述。
本发明实施例还提供了一种终端设备的示意图。该实施例终端设备包括:处理器、存储器以及存储在所述存储器中并可在所述处理器上运行的计算机程序。所述处理器执行所述计算机程序时实现上述序列化和反序列化方法实施例中的步骤。或者,所述处理器执行所述计算机程序时实现上述序列化和反序列化装置中各模块的功能。所述计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器中,并由所述处理器执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序在所述终端设备中的执行过程。
所述终端设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。所述终端设备可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,所述示意图仅仅是终端设备的示例,并不构成对所述终端设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述终端设备还可以包括输入输出设备、网络接入设备、总线等。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器 (Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列 (Field-Programmable Gate Array,FPGA) 或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述终端设备的控制中心,利用各种接口和线路连接整个终端设备的各个部分。
所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述终端设备的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card, SMC),安全数字(Secure Digital, SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
其中,所述终端设备集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。
Claims (9)
1.一种序列化和反序列化方法,其特征在于,包括:
响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;
响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化;
其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化,具体包括:
当所述对象为指针类型时,判断预设的集合内是否存在该指针,当所述集合内不存在该指针时,生成该指针的唯一标识符,序列化所述唯一标识符和该指针指向的类型;当所述集合内存在该指针时,序列化该指针所对应的唯一标识符;
当所述对象为slice类型时,判断预设的集合内是否存在该slice,当所述集合内不存在该slice时,序列化所述唯一标识符和该slice的长度;当所述集合内存在该slice时,序列化该slice所对应的唯一标识符;
当所述对象为map类型时,判断预设的集合内是否存在该map,当所述集合内不存在该map时,序列化所述唯一标识符、该map的长度和该map中的每一元素;当所述集合内存在该map时,序列化该map所对应的唯一标识符;
当所述对象为interface类型时,根据预设的第二序列化函数对该interface的类型进行判断,基于所述interface的类型对该interface对应的唯一标识符和该interface对应的值进行序列化。
2.如权利要求1所述的序列化和反序列化方法,其特征在于,根据预设的第一规则对不同类型的对象进行序列化前还包括步骤:
对所述源代码中所有对象的类型进行筛选,去除函数类型和channel类型的对象。
3.如权利要求1所述的序列化和反序列化方法,其特征在于,所述根据预设的第一规则对不同类型的对象进行序列化具体包括:
当所述对象为固定字节大小的基础类型时,根据预设的编码进行序列化;
当所述对象为不定字节大小的基础类型时,先序列化该对象的长度,再序列化该对象的内容;
当所述对象为结构体类型时,调用预设的第一序列化函数进行序列化;
当所述对象为数组类型时,遍历该数组并对该数组内的每一元素进行序列化。
4.如权利要求3所述的序列化和反序列化方法,其特征在于,所述根据预设的第二规则反序列化不同类型的字段具体包括:
当判断待反序列化的字段为固定字节大小的基础类型时,根据预设的编码进行反序列化;
当判断待反序列化的字段为不定字节大小的基础类型时,先读出该基础类型的长度,再根据该基础类型的长度读出相应的内容;
当判断待反序列化的字段为结构体类型时,调用预设的第一反序列化函数进行序列化;
当判断待反序列化的字段为数组类型时,待反序列化的字段内的每一元素进行反序列化。
5.如权利要求1所述的序列化和反序列化方法,其特征在于,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化具体包括:
当待反序列化的字段为数组类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的指针加入所述集合中,并对该指针指向的类型进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的指针赋值至当前字段;
当待反序列化的字段为slice类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的slice加入所述集合中,并对该slice的长度进行反序列化,根据该slice的长度对该slice的每一元素进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的slice赋值至当前字段;
当待反序列化的字段为map类型时,读出唯一标识符,判断预设的集合内是否存在该唯一标识符,当所述集合内不存在该唯一标识符时,将该唯一标识符和对应的map加入所述集合中,并对该map的长度进行反序列化,根据该slice的长度对该map的每一元素进行反序列化;当所述集合内存在该唯一标识符时,将与所述唯一标识符对应的map赋值至当前字段;
当待反序列化的字段为interface类型时,通过第二反序列化函数读出唯一标识符,根据所述唯一标识符调用相应的反序列化代码,根据所述反序列化代码对interface的值进行反序列化。
6.如权利要求1所述的序列化和反序列化方法,其特征在于,所述遍历预设工程内的所有源代码,分析所述源代码内所有对象的类型具体包括步骤:
通过预设的标准库,构建源代码的抽象语法树;
分析所述抽象语法树,得到源代码内所有对象的类型。
7.如权利要求1所述的序列化和反序列化方法,其特征在于,当所述源代码为结构体类型时,且该结构体内包括第三方类型时,在所述序列化函数中生成第一函数调用对所述第三方类型进行序列化;
当判断待反序列化的字段为结构体类型,且该结构体内包括第三方类型时,在所述反序列化函数中生成第二函数调用对所述第三方类型进行反序列化。
8.如权利要求1所述的序列化和反序列化方法,其特征在于,所述方法适用于go语言。
9.一种序列化和反序列化装置,其特征在于,包括:
序列化模块,用于响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;
反序列化模块,用于响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化;
其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化,具体包括:
当所述对象为指针类型时,判断预设的集合内是否存在该指针,当所述集合内不存在该指针时,生成该指针的唯一标识符,序列化所述唯一标识符和该指针指向的类型;当所述集合内存在该指针时,序列化该指针所对应的唯一标识符;
当所述对象为slice类型时,判断预设的集合内是否存在该slice,当所述集合内不存在该slice时,序列化所述唯一标识符和该slice的长度;当所述集合内存在该slice时,序列化该slice所对应的唯一标识符;
当所述对象为map类型时,判断预设的集合内是否存在该map,当所述集合内不存在该map时,序列化所述唯一标识符、该map的长度和该map中的每一元素;当所述集合内存在该map时,序列化该map所对应的唯一标识符;
当所述对象为interface类型时,根据预设的第二序列化函数对该interface的类型进行判断,基于所述interface的类型对该interface对应的唯一标识符和该interface对应的值进行序列化。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810810008.2A CN109117209B (zh) | 2018-07-23 | 2018-07-23 | 序列化和反序列化方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810810008.2A CN109117209B (zh) | 2018-07-23 | 2018-07-23 | 序列化和反序列化方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109117209A CN109117209A (zh) | 2019-01-01 |
CN109117209B true CN109117209B (zh) | 2021-10-01 |
Family
ID=64862962
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810810008.2A Active CN109117209B (zh) | 2018-07-23 | 2018-07-23 | 序列化和反序列化方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109117209B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111427522B (zh) * | 2019-07-17 | 2022-08-05 | 杭州海康威视数字技术股份有限公司 | 一种数据远程同步方法、装置及系统 |
WO2021097785A1 (zh) * | 2019-11-22 | 2021-05-27 | 云图技术有限公司 | 数据序列化、数据反序列化方法、装置和计算机设备 |
CN111124551B (zh) * | 2019-11-22 | 2023-11-17 | 矩阵元技术(深圳)有限公司 | 数据序列化、数据反序列化方法、装置和计算机设备 |
CN111026401A (zh) * | 2019-12-05 | 2020-04-17 | 杭州有赞科技有限公司 | 一种移动端热修复方法 |
CN110932916B (zh) * | 2019-12-20 | 2022-11-15 | 惠州市德赛西威汽车电子股份有限公司 | 一种改进的oma dm协议数据编码方法 |
CN111478898B (zh) * | 2020-04-03 | 2022-03-11 | 爱瑟福信息科技(上海)有限公司 | Someip协议通信数据的序列化和反序列化方法及其系统 |
CN111680051B (zh) * | 2020-05-29 | 2023-10-20 | 杭州趣链科技有限公司 | 一种数据序列化和反序列化方法、设备及存储介质 |
CN111931184B (zh) * | 2020-08-11 | 2023-06-30 | 中国工商银行股份有限公司 | 反序列化漏洞检测方法及装置 |
CN112671734B (zh) * | 2020-12-16 | 2023-06-09 | 中国平安人寿保险股份有限公司 | 面向多数据源的报文处理方法及其相关设备 |
CN112925768B (zh) * | 2021-03-03 | 2024-02-27 | 北京中安星云软件技术有限公司 | 一种基于Protobuf协议的HBASE数据库解析方法及系统 |
CN114679493B (zh) * | 2022-03-23 | 2023-07-28 | 北京睿芯高通量科技有限公司 | 一种安全的序列化和反序列化传输数据的方法 |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101661391A (zh) * | 2009-09-24 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种对象序列化方法、对象反序列化方法、装置及系统 |
CN102411499A (zh) * | 2011-08-11 | 2012-04-11 | 浙江大学 | 一种基于有向图结构的单个电控单元的系统信息提取方法 |
CN103019689A (zh) * | 2012-11-21 | 2013-04-03 | 上海富欣智能交通控制有限公司 | 通用的对象序列化的实现方法 |
CN103778248A (zh) * | 2014-02-18 | 2014-05-07 | 成都致云科技有限公司 | 高效自描述的复杂数据对象序列化方法 |
CN106843819A (zh) * | 2015-12-03 | 2017-06-13 | 北京国双科技有限公司 | 对象序列化的方法及装置 |
CN107341262A (zh) * | 2017-07-14 | 2017-11-10 | 上海达梦数据库有限公司 | 数据库中对象类型列的序列化、反序列化方法及装置 |
CN107451237A (zh) * | 2017-07-26 | 2017-12-08 | 阿里巴巴集团控股有限公司 | 序列化与反序列化方法、装置及设备 |
CN107483399A (zh) * | 2017-06-30 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 一种在远程过程调用中的信息封装方法及装置 |
CN107767434A (zh) * | 2017-09-13 | 2018-03-06 | 福建天晴数码有限公司 | 虚拟现实技术中纹理贴图配置信息的获取方法、存储介质 |
CN107992624A (zh) * | 2017-12-22 | 2018-05-04 | 百度在线网络技术(北京)有限公司 | 解析序列化数据的方法、装置、存储介质及终端设备 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8863097B2 (en) * | 2010-12-29 | 2014-10-14 | Sap Ag | Providing code list extensibility |
-
2018
- 2018-07-23 CN CN201810810008.2A patent/CN109117209B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101661391A (zh) * | 2009-09-24 | 2010-03-03 | 金蝶软件(中国)有限公司 | 一种对象序列化方法、对象反序列化方法、装置及系统 |
CN102411499A (zh) * | 2011-08-11 | 2012-04-11 | 浙江大学 | 一种基于有向图结构的单个电控单元的系统信息提取方法 |
CN103019689A (zh) * | 2012-11-21 | 2013-04-03 | 上海富欣智能交通控制有限公司 | 通用的对象序列化的实现方法 |
CN103778248A (zh) * | 2014-02-18 | 2014-05-07 | 成都致云科技有限公司 | 高效自描述的复杂数据对象序列化方法 |
CN106843819A (zh) * | 2015-12-03 | 2017-06-13 | 北京国双科技有限公司 | 对象序列化的方法及装置 |
CN107483399A (zh) * | 2017-06-30 | 2017-12-15 | 武汉斗鱼网络科技有限公司 | 一种在远程过程调用中的信息封装方法及装置 |
CN107341262A (zh) * | 2017-07-14 | 2017-11-10 | 上海达梦数据库有限公司 | 数据库中对象类型列的序列化、反序列化方法及装置 |
CN107451237A (zh) * | 2017-07-26 | 2017-12-08 | 阿里巴巴集团控股有限公司 | 序列化与反序列化方法、装置及设备 |
CN107767434A (zh) * | 2017-09-13 | 2018-03-06 | 福建天晴数码有限公司 | 虚拟现实技术中纹理贴图配置信息的获取方法、存储介质 |
CN107992624A (zh) * | 2017-12-22 | 2018-05-04 | 百度在线网络技术(北京)有限公司 | 解析序列化数据的方法、装置、存储介质及终端设备 |
Non-Patent Citations (1)
Title |
---|
基于JSON的雷达报文交换框架;方睿等;《中国电子科学研究院学报》;20171231;第12卷(第6期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN109117209A (zh) | 2019-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109117209B (zh) | 序列化和反序列化方法及装置 | |
CN111428462A (zh) | 通讯协议模板构建的方法及终端设备 | |
CN109558525B (zh) | 一种测试数据集的生成方法、装置、设备和存储介质 | |
CN111249736B (zh) | 代码处理方法及装置 | |
CN109726217B (zh) | 一种数据库操作方法、装置、设备及存储介质 | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN113238740B (zh) | 代码生成方法、代码生成装置、存储介质及电子设备 | |
CN109062906B (zh) | 程序语言资源的翻译方法及装置 | |
CN113419789A (zh) | 数据模型脚本的生成方法和装置 | |
CN111443901A (zh) | 一种基于Java反射的业务扩展方法及装置 | |
CN111209736A (zh) | 文本文件解析方法、装置、计算机设备及存储介质 | |
CN112181430A (zh) | 代码变更统计方法、装置、电子设备及存储介质 | |
CN111124382A (zh) | Java中的属性赋值方法、装置及服务器 | |
CN108170425B (zh) | 一种程序代码的修改方法、修改装置及终端设备 | |
CN110941655A (zh) | 一种数据格式转换方法及装置 | |
CN112883088B (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN112000589A (zh) | 一种数据写入方法、数据读取方法、装置及电子设备 | |
CN110704635A (zh) | 一种知识图谱中三元组数据的转换方法及装置 | |
CN116414689A (zh) | 一种基于反射机制的接口参数校验方法及系统 | |
CN115757174A (zh) | 一种数据库的差异检测方法及装置 | |
CN115390847A (zh) | 日志处理方法及装置、计算机可读存储介质、终端 | |
CN114896161A (zh) | 基于人工智能的文件构造方法、装置、计算机设备及介质 | |
CN111061468B (zh) | 一种映射方法及装置 | |
CN110471708B (zh) | 基于可重用组件的配置项获取的方法及装置 | |
CN113050935A (zh) | 生成混入对象的方法、装置、计算设备及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |