Golang怎么使用gob实现结构体的序列化
更新时间:2023-09-11什么是gob
gob 是Go标准库中的编码格式,它提供了一种简单、安全和高效的方式在网络中进行数据传输,gob格式只用于Go语言间的数据传输和存储,它支持任何 Go 支持类型的序列化和反序列化,包括内置类型、自定义类型以及指针类型等。
gob的序列化和反序列化
gob提供了两个函数,用于数据的编码和解码,即 gob.NewEncoder() 和 gob.NewDecoder(),分别用于将数据编码成二进制格式进行传输和将传输的二进制格式解码为数据对象。
// 定义示例结构体 type ExampleStruct struct { Name string Age int Height float64 } func main() { // 编码为二进制 var buf bytes.Buffer enc := gob.NewEncoder(&buf) err := enc.Encode(ExampleStruct{"Zoe", 28, 1.67}) if err != nil { fmt.Println("encode error:", err) return } data := buf.Bytes() // 解码为数据对象 var newObj ExampleStruct dec := gob.NewDecoder(bytes.NewReader(data)) err = dec.Decode(&newObj) if err != nil { fmt.Println("decode error:", err) return } fmt.Println(newObj) }
gob序列化中的字段信息
在gob中,字段名称是重要的序列化信息,它不仅保留了类型,还保留了字段名。如果在序列化后对字段名称进行更改,则反序列化将失败。因此,在编写代码时需要特别注意字段名的正确性。
// 示例中更改字段名会导致反序列化失败 type ExampleStruct struct { Name string Age int Height float64 } func main() { // 编码为二进制 var buf bytes.Buffer enc := gob.NewEncoder(&buf) err := enc.Encode(ExampleStruct{"Zoe", 28, 1.67}) if err != nil { fmt.Println("encode error:", err) return } data := buf.Bytes() // 示例中更改字段名 type ExampleStruct struct { Name2 string // 更改了字段名 Age int Height float64 } // 解码为数据对象,会失败 var newObj ExampleStruct dec := gob.NewDecoder(bytes.NewReader(data)) err = dec.Decode(&newObj) if err != nil { fmt.Println("decode error:", err) return } fmt.Println(newObj) }
注意事项
在使用gob时,需要特别注意以下几点。
1. 结构体中的字段必须是导出成员变量(首字母大写),否则编解码会出错
2. 被编码的对象必须使用指针进行传递,否则将会得到一个错误:gob编码类型 does not implement the Encoder interface
3. 在进行解码时,需要保证解码出的类型正确,否则将会解码失败
4. gob序列化后的字节码很少被人类读懂,无法通过简单的查找文本的方式进行调试
5. gob只能用于Go语言之间的数据传输和存储,不适用于跨语言数据传输。
总结:gob是Go语言中用于数据编码和解码的标准库,支持任何 Go 支持类型的序列化和反序列化,并提供了两个函数NewEncoder() 和 NewDecoder(),可以将数据编码成二进制格式进行传输和将传输的二进制格式解码为数据对象。在使用gob时,需要注意结构体中的字段必须是导出成员变量,被编码的对象必须使用指针进行传递,在进行解码时,需要保证解码出的类型正确。同时注意gob序列化后的字节码很少被人类读懂,无法通过简单的查找文本的方式进行调试,只能用于Go语言之间的数据传输和存储。