使用 go 反射进行序列化和反序列化:序列化:使用 encoding/json.marshal 函数将结构序列化为字节流。反序列化:使用 encoding/json.unmarshal 函数从字节流中反序列化结构。
如何使用 Go 反射进行序列化和反序列化
反射是 Go 中强大的功能,允许您检查和修改运行中的程序。它可用于多种用途,包括序列化和反序列化,它使您可以将数据结构保存为字节流,然后在以后重新创建它们。
序列化
要使用反射序列化结构,请使用 encoding/json
包中的 Marshal
函数。该函数需要指向结构的指针作为其第一个参数,并返回序列化后的字节切片。
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
)
type person struct {
FirstName string
LastName string
Age int
}
func main() {
p := person{FirstName: "John", LastName: "Doe", Age: 30}
b, err := json.Marshal(&p)
if err != nil {
panic(err)
}
// 保存序列化后的数据到文件
err = ioutil.WriteFile("person.json", b, 0644)
if err != nil {
panic(err)
}
}
反序列化
要反序列化已序列化的数据,请使用 encoding/json
包中的 Unmarshal
函数。该函数需要指向结构的指针作为其第一个参数,以及包含序列化数据的字节切片作为其第二个参数。
func main() {
var p person
b, err := ioutil.ReadFile("person.json")
if err != nil {
panic(err)
}
// 反序列化数据到结构
err = json.Unmarshal(b, &p)
if err != nil {
panic(err)
}
// 打印反序列化的数据
fmt.Printf("%+vn", p)
}
实战案例
以下是一个使用反射进行序列化和反序列化的实际示例:
type user struct {
ID int
Name string
}
var users = []user{
{1, "john"},
{2, "jane"},
}
var b []byte
func main() {
// 序列化用户数组
b, _ = json.Marshal(users)
// 将序列化后的数据保存到文件中
ioutil.WriteFile("users.json", b, 0644)
// 反序列化文件中的数据
var loadedUsers []user
json.Unmarshal(b, &loadedUsers)
// 打印反序列化的用户
fmt.Println(loadedUsers)
}