import "encoding/gob"
gob包管理gob流——在编码器(发送器)和解码器(接受器)之间交换的binary值。一般用于传递远端程序调用(RPC)的参数和结果,如net/rpc包就有提供。
本实现给每一个数据类型都编译生成一个编解码程序,当单个编码器用于传递数据流时,会分期偿还编译的消耗,是效率最高的。
基本特点
1.gob流是自解码的
2.流中的所有数据都有前缀(采用一个预定义类型的集合)指明其类型.
3.指针不会传递,而是传递值
4.递归的类型可以很好的工作,但是递归的值(比如说值内某个成员直接/间接指向该值)会出问题。
go编解码过程
1.先要创建一个编码器
2.并向其一共一系列数据:可以是值,也可以是指向实际存在数据的指针。
3.编码器会确保所有必要的类型信息都被发送。
4.在接收端,解码器从编码数据流中恢复数据并将它们填写进本地变量里
下面写一个小实例演示一下过程
package main
import (
"bytes"
"encoding/gob"
"log"
"fmt"
)
type User struct {
Name string
}
func main() {
var network bytes.Buffer
// 1.创建编码器
enc := gob.NewEncoder(&network)
// 2.向编码器中写入数据
err := enc.Encode(User{Name:"酷走天涯"})
if err != nil {
log.Fatal(err)
}
// 3.创建解码器
dec := gob.NewDecoder(&network)
var user User
// 4.解码
dec.Decode(&user)
fmt.Println(user.Name)
}
我们创建了一个编码器,将数据写入流中,然后创建了一个解码器,将数据流解码到user变量中
我们下面自定义编码的编解码过程
package main
import (
"bytes"
"encoding/gob"
"log"
"fmt"
)
type User struct {
Name string
}
// 编码过程
func (v User) MarshalBinary() ([]byte, error) {
var b bytes.Buffer
fmt.Fprintln(&b, v.Name)
return b.Bytes(), nil
}
// 自定义解码过程
func (v *User) UnmarshalBinary(data []byte) error {
// A simple encoding: plain text.
b := bytes.NewBuffer(data)
_, err := fmt.Fscanln(b, &v.Name)
return err
}
func main() {
var network bytes.Buffer
// 1.创建编码器
enc := gob.NewEncoder(&network)
// 2.向编码器中写入数据
err := enc.Encode(User{Name:"酷走天涯"})
if err != nil {
log.Fatal(err)
}
// 3.创建解码器
dec := gob.NewDecoder(&network)
var user User
// 4.解码
dec.Decode(&user)
fmt.Println(user)
}
让对象实现方法 UnmarshalBinary(data []byte) error
和 MarshalBinary() ([]byte, error)
即可实现重写编码过程