在 go 中,序列化自定义类型的方法有:使用 json 序列化时实现 json.marshaler 接口,使用 gob 序列化时实现 encoding/gob 包中的 gobencoder 和 gobdecoder 接口。
使用 Golang 对自定义类型进行序列化
在 Golang 中,序列化是指将对象的状态转换为可存储或传输的格式。对于自定义类型,需要实现 encoding/json 或者 encoding/gob 包中的序列化接口。
使用 JSON 序列化
- 实现 json.Marshaler 接口,实现 MarshalJSON 方法。
- MarshalJSON 方法接收自定义类型的值并返回其 JSON 表示。
实战案例:序列号员工结构体
package main
import (
"encoding/json"
"fmt"
)
// Employee is a custom type representing an employee.
type Employee struct {
Name string
Age int
Skills []string
}
// MarshalJSON implements the json.Marshaler interface.
func (e Employee) MarshalJSON() ([]byte, error) {
type Alias Employee
return json.Marshal(&struct{ Alias }{e})
}
func main() {
emp := Employee{Name: "John Doe", Age: 30, Skills: []string{"<a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/16009.html" target="_blank">golang</a>", "javascript"}}
encoded, err := json.Marshal(emp)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("JSON:", string(encoded))
}
使用 Gob 序列化
- 实现 encoding/gob 包中的 GobEncoder 和 GobDecoder 接口。
- GobEncode 方法接收自定义类型的值并将其写入一个缓冲区。
- GobDecode 方法从缓冲区读取数据并恢复自定义类型的值。
实战案例:序列号一个复杂结构
package main
import (
"encoding/gob"
"fmt"
"io/ioutil"
"os"
)
// ComplexStruct represents a complex data structure.
type ComplexStruct struct {
Map map[string]int
Slice []int
InnerStruct struct {
Field1 string
Field2 int
}
}
func main() {
// Register the ComplexStruct type for serialization.
gob.Register(ComplexStruct{})
// Create a ComplexStruct instance.
cs := ComplexStruct{
Map: map[string]int{"key1": 1, "key2": 2},
Slice: []int{3, 4, 5},
InnerStruct: struct {
Field1 string
Field2 int
}{"value1", 6},
}
// Encode the ComplexStruct to a file.
f, err := os.Create("data.gob")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer f.Close()
enc := gob.NewEncoder(f)
if err := enc.Encode(cs); err != nil {
fmt.Println("Error encoding:", err)
return
}
// Decode the ComplexStruct from the file.
data, err := ioutil.ReadFile("data.gob")
if err != nil {
fmt.Println("Error reading file:", err)
return
}
dec := gob.NewDecoder(bytes.NewReader(data))
var decoded ComplexStruct
if err := dec.Decode(&decoded); err != nil {
fmt.Println("Error decoding:", err)
return
}
// Print the decoded struct.
fmt.Println("Decoded:", decoded)
}