除了众所周知的JSON和XML之外,Go还提供二进制格式 gob
。本文将介绍如何使用gob
包。
将对象序列化为二进制格式
Golang 版本
1.12.1
前沿
除了众所周知的JSON和XML之外,Go还提供二进制格式 gob
。本文将介绍如何使用gob
包。
实现
package main
import (
"bytes"
"encoding/gob"
"fmt"
)
type User struct {
FirstName string
LastName string
Age int
Active bool
}
func (u User) String() string {
return fmt.Sprintf(`{"FirstName":%s,"LastName":%s,
"Age":%d,"Active":%v }`,
u.FirstName, u.LastName, u.Age, u.Active)
}
type SimpleUser struct {
FirstName string
LastName string
}
func (u SimpleUser) String() string {
return fmt.Sprintf(`{"FirstName":%s,"LastName":%s}`,
u.FirstName, u.LastName)
}
func main() {
var buff bytes.Buffer
// Encode value
enc := gob.NewEncoder(&buff)
user := User{
"Radomir",
"Sohlich",
30,
true,
}
enc.Encode(user)
fmt.Printf("%X\n", buff.Bytes())
// Decode value
out := User{}
dec := gob.NewDecoder(&buff)
dec.Decode(&out)
fmt.Println(out.String())
enc.Encode(user)
out2 := SimpleUser{}
dec.Decode(&out2)
fmt.Println(out2.String())
}
$ go run main.go
40FF81030101045573657201FF82000104010946697273744E616D65010C0001084C6173744E616D65010C0001034167650104000106416374697665010200000019FF8201075261646F6D69720107536F686C696368013C010100
{"FirstName":Radomir,"LastName":Sohlich,"Age":30,"Active":true }
{"FirstName":Radomir,"LastName":Sohlich}
原理
gob
序列化和反序列化需要编码器和解码器。 gob.NewEncoder
函数使用底层Writer
创建Encoder
。 每次调用Encode
方法都会将对象序列化为gob
格式。 gob格式本身就是自描述的二进制格式。 这意味着每个序列化结构前面都有其描述。
要解码序列化形式的数据,必须通过使用底层Reader
调用gob.NewDecoder
来创建解码器。 然后,Decode
接受指向该反序列化数据的结构指针。
请注意,gob格式不需要源和目标类型完全匹配。 有关规则,请参阅
encoding/gob
包。