序列化和反序列化方法及装置制造方法及图纸

技术编号:19963929 阅读:23 留言:0更新日期:2019-01-03 12:40
本发明专利技术公开了一种序列化和反序列化方法,包括:响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。本发明专利技术能有效解决现有序列化技术只能对树状数据进行序列化的问题,实现对图状数据进行自动序列化。

Serialization and deserialization methods and devices

The invention discloses a serialization and deserialization method, which includes: traversing all source codes in a preset project in response to a serialization instruction, obtaining the types of all objects in the source codes, serializing different types of objects according to preset first rules, and according to the preset unique identifier and the object when the object is a preset type. Mapping relationships are serialized; different types of fields are de-serialized according to the preset second rule in response to the de-serialization instructions; where, when a unique identifier is read out, the corresponding types of fields are de-serialized according to the mapping relationship between the unique identifier and the object. The invention can effectively solve the problem that the existing serialization technology can only serialize tree data, and realize automatic serialization of graph data.

【技术实现步骤摘要】
序列化和反序列化方法及装置
本专利技术涉及计算机领域,尤其涉及一种序列化和反序列化方法及装置。
技术介绍
数据序列化技术广泛应用于各种数据交互场景.例如,网络传输,数据存储,配置文件的读写等。不同序列化技术的应用场景也有所区别,现有技术中的序列化方法可主要有以下几种类型.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语言的类型名是在变量名后面,例如:typeAstruct{fieldint}。上述代码定义结构体A,结构体A包含一个类型为int,名字为field的字段。计算机领域内树和图的概念广泛存在。树是一种包含结构,节点之间是父子关系,只有父子之间有连线。而图这种结构任意节点之间都可能有连线.这里的数据树和数据图也是类似的概念。例如图1(a)所示的树状结构(数据树),用go代码表示如下:typeAstruct{field1Bfield2C}typeBstruct{fieldint}typeCstruct{fieldint}结构体A是数据树的根,现有的序列化技术都可以序列化结构体A.如图1(b)所示的图状结构(数据图),用go代码表示如下:typeAstruct{field1Bfield2C}typeBstruct{field*int}typeCstruct{field*int}其中当B和C的field共享一个int指针的时候,就构成了数据图。这种情况,现有技术虽然可以将结构体A序列化得到字节流,但是却无法正确的将A从字节流中反序列化出来。因为反序列化出来得到的B.field和C.field是两个int指针,而原来结构体A是可能共享int指针的。因此现有技术是不能处理这种情况的。另一个例子如图1(c)所示,go代码表示如下:typeAstruct{child*B}typeBstruct{parent*A}这种情况,A和B相互引用,现有技术是完全不能处理的.本文所描述的技术能序列化数据图,并将数据图正确的按原有结构反序列化出来,这是其他所有序列化技术所不具备的特点.
技术实现思路
本专利技术实施例的目的是提供一种序列化和反序列化方法及装置,能有效解决现有序列化技术只能对树状数据进行序列化的问题,实现对图状数据进行自动序列化。为实现上述目的,本专利技术实施例提供了一种序列化和反序列化方法,包括:响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。与现有技术相比,本专利技术公开的序列化和反序列化方法通过预设唯一标识符对预设类型的数据进行序列化,且当读出唯一标识符时,根据所述唯一标识符对相应类型的字段进行反序列化,使得该唯一标识符与特定类型的数据唯一映射,则在序列化过程中无需多次序列化同一对象,能有效解决现有序列化技术只能对树状数据进行序列化的问题,实现对图状数据进行自动序列化。作为上述方案的改进,根据预设的第一规则对不同类型的对象进行序列化前还包括步骤:对所述所有源代码所应用的所有类型进行筛选,去除函数类型和channel类型的对象。作为上述方案的改进,所述根据预设的第一规则对不同类型的对象进行序列化具体包括:当所述对象为固定字节大小的基础类型时,根据预设的编码进行序列化;当所述对象为不定字节大小的基础类型时,先序列化该对象的长度,再序列化该对象的内容;当所述对象为结构体类型时,调用预设的第一序列化函数进行序列化;当所述对象为数组类型时,遍历该数组并对该数组内的每一元素进行序列化。作为上述方案的改进,所述根据预设的第二规则反序列化不同类型的字段具体包括:当判断待反序列化的字段为固定字节大小的基础类型时,根据预设的编码进行反序列化;当判断待反序列化的字段为不定字节大小的基础类型时,先读出该基础类型的长度,再根据该基础类型的长度读出相应的内容;当判断待反序列化的字段为结构体类型时,调用预设的第一反序列化函数进行序列化;当判断待反序列化的字段为数组类型时,待反序列化的字段内的每一元素进行反序列化。作为上述方案的改进,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化具体包括:当所述对象为指针类型时,判断预设的集合内是否存在该指针,当所述集合内不存在该指针时,生成该指针的唯一标识符,序列化所述唯一标识符和该指针指向的类型;当所述集合内存在该指针时,序列化该指针所对应的唯一标识符;当所述对象为slice类型时,判断预设的集合内是否存在该slice,当所述集合内不存在该slice时,序列化所述唯一标识符和该slice的长度;当所述集合内存在该slice时,序列化该slice所对应的唯一标识符;当所述对象为map类型时,判断预设的集合内是否存在该map,当所述集合内不存在该map时,序列化所述唯一标识符、该map的长度和该map中的每一元素;当所述集合内存在该map时,序列化该map所对应的唯一标识符;当所述对象为interface类型时,根据预设的第二序列化函数对该interface的类型进行判断,基于所述interface的类型对该interface对应的唯一标识符和该interface对应的值进行序列化。作为上述方案的改进,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化具体包括:当待反序列化的字段为数组类型时,读出唯一标识符,判断预设的集合内是否存本文档来自技高网
...

【技术保护点】
1.一种序列化和反序列化方法,其特征在于,包括:响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。

【技术特征摘要】
1.一种序列化和反序列化方法,其特征在于,包括:响应于序列化指令,遍历预设工程内的所有源代码,获取所述源代码中所有对象的类型,根据预设的第一规则对不同类型的对象进行序列化;其中,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化;响应于反序列化指令,根据预设的第二规则反序列化不同类型的字段;其中,当读出唯一标识符时,根据所述唯一标识符和对象的映射关系对相应类型的字段进行反序列化。2.如权利要求1所述的序列化和反序列化方法,其特征在于,根据预设的第一规则对不同类型的对象进行序列化前还包括步骤:对所述源代码中所有对象的类型进行筛选,去除函数类型和channel类型的对象。3.如权利要求1所述的序列化和反序列化方法,其特征在于,所述根据预设的第一规则对不同类型的对象进行序列化具体包括:当所述对象为固定字节大小的基础类型时,根据预设的编码进行序列化;当所述对象为不定字节大小的基础类型时,先序列化该对象的长度,再序列化该对象的内容;当所述对象为结构体类型时,调用预设的第一序列化函数进行序列化;当所述对象为数组类型时,遍历该数组并对该数组内的每一元素进行序列化。4.如权利要求3所述的序列化和反序列化方法,其特征在于,所述根据预设的第二规则反序列化不同类型的字段具体包括:当判断待反序列化的字段为固定字节大小的基础类型时,根据预设的编码进行反序列化;当判断待反序列化的字段为不定字节大小的基础类型时,先读出该基础类型的长度,再根据该基础类型的长度读出相应的内容;当判断待反序列化的字段为结构体类型时,调用预设的第一反序列化函数进行序列化;当判断待反序列化的字段为数组类型时,待反序列化的字段内的每一元素进行反序列化。5.如权利要求4所述的序列化和反序列化方法,其特征在于,当所述对象为预设的类型时,根据预设的唯一标识符和所述对象的映射关系进行序列化具体包括:当所述对象为指针类型时,判断预设的集合内是否存在该指针,当所述集合内不存在该指针时,生成该指针的唯一标识符,序列化所述唯一标识符和该指针指向的类型;当所述集合内存在该指针时,序列化该指针所对应的唯一标识符;当所述对象为slice类型时,判断预设的集合内是否存在该slice,当所述集合内不存在该slice时,序列化所述唯一标识符和该slice的长度;当所述集合内存在该slice时,序列化该slice所对应的唯一标识符;当所述对象为map类型时,判断预设的集合内是否存在该map,当所述集合内不存在该map时,序列化所述唯一标识符、该map的长度和该map中的每一元素;当所述集合内存在该map时,序列化该map所对应的唯一标识符;当所述对象为interface类型时,根据预设的第二序列化函数对该interface的类型进行判断,基于所述interface的类型对该interface对应的唯一标...

【专利技术属性】
技术研发人员:徐波
申请(专利权)人:广州多益网络股份有限公司广东利为网络科技有限公司多益网络有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1