在 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) }
登录后复制
以上就是使用 Golang 时如何对自定义类型进行序列化?的详细内容,更多请关注叮当号网其它相关文章!
文章来自互联网,只做分享使用。发布者:周斌,转转请注明出处:https://www.dingdanghao.com/article/501691.html