golang序列化方法是什么
导读:本文共6492字符,通常情况下阅读需要22分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: golang序列化方法有:1、利用Gob包管理gob流,gob是和类型绑定的,如果发现多了或者少了,会依据顺序填充或者截断。2、利用json包,能实现RFC 7159中定义的JSON编码和解码;在序列化的过程中,如果结构体内的成员是小写的,则会出现错误。3、利用Binary包,能实现数... ...
目录
(为您整理了一些要点),点击可以直达。
golang序列化方法有:1、利用Gob包管理gob流,gob是和类型绑定的,如果发现多了或者少了,会依据顺序填充或者截断。2、利用json包,能实现RFC 7159中定义的JSON编码和解码;在序列化的过程中,如果结构体内的成员是小写的,则会出现错误。3、利用Binary包,能实现数字和字节序列之间的简单转换以及varint的编码和解码。4、利用protobuf协议。
在编程过程中,我们总是要遇到这样的问题,就是将我们的数据对象要在网络中传输或保存到文件,这就需要对其编码和解码动作。
目前存在很多编码格式:json, XML, Gob, Google Protocol Buffer 等,在Go 语言中,如何对数据进行这样的编码和解码呢?
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。
反过来,把变量从从存储区中重新读取,重新创建该对象,则为反序列化。
在Go语言中,encoding 包就是专门来处理这类序列化的编码和解码的问题。
gob
包管理 gob 流–编码器(发送器)和解码器(接收器)之间交换的二进制值。一个典型的用途是传输远程过程调用(RPCs)的参数和结果,如 "net/rpc "包中就使用了gobs 流。
他的官网给出了一个示例:
packagemain
}
运行结果是:
个人认为这个例子是真的好。我们看到,结构体P
和 Q
是不同的,我们看到Q
少了一个 Z
变量。
但是,在解码的时候,仍然能解析得出来,这说明,使用 gob
时,是根据类型绑定的,如果发现多了或者少了,会依据顺序填充或者截断。
接下来,我们详情说说怎么编码吧:
首先,我们需要定义一个 bytes.Buffer
类型,用来承接需要序列化的结构体,这个类型是这样的:
使用上面的例子,可以看到输出是:
可以看到,Buffer
里,是二进制数(一个字节8个bit,最高255)
之后,对需要编码序列化的结构体进行编码:
这里,首先是要获得 Encoder
对象,获得对象后,利用 *Encoder
对象的方法 Encode
进行编码。
这里,需要注意的是,Encode
如果是网络编程的,其实是可以直接发送消息给对方的,而不必进行 socket 的send 操作。
比如:在 srever
端有代码:
}
在客户端client有:
输出:
{12name}
最后,对其解码的步骤为:
json
包实现了 RFC 7159
中定义的 JSON
编码和解码。JSON和Go值之间的映射在 Marshal 和 Unmarshal 函数的文档中进行了描述。
示例如下:
在序列化的过程中,如果结构体内的成员是小写的,则会出现错误。以上两种方式,都会出现这样的结果
我们以 json
序列化为例子,看一下如果是小写的话,会出现什么样的结果:
packagemain
}
输出:
我们看到,小写的部分将不会被序列化到,也就是说,会是空值。
这个虽然不会报错,但是很明显,不是我们想要看到的结果。
我们来看一个会报错的例子:
}
这段代码会报错:
2020/12/3016:44:47encodeerror:gob:typemain.Messagehasnoexportedfields
提醒我们注意,结构体的大小写是很敏感的!!!
Binary
包实现 数字 和 字节 序列之间的简单转换以及varint的编码和解码。
通过读取和写入固定大小的值来转换数字。 固定大小的值可以是固定大小的算术类型(bool,int8,uint8,int16,float32,complex64等),也可以是仅包含固定大小值的数组或结构体。
示例:
packagemain
这里需要注意:如果序列化的类型是 int
类型的话,将会报错:
binary.Writefailed:binary.Write:invalidtypeint
而且,序列化的值是空的。
这是由于,他在前面已经解释清楚了,只能序列化固定大小的类型(bool,int8,uint8,int16,float32,complex64…),或者是结构体和固定大小的数组。
当然,go语言还有其他的序列化方法,如 protobuf
协议。
golang序列化方法是什么的详细内容,希望对您有所帮助,信息来源于网络。