Go 中序列化与反序列化

2024-01-02 15:29:18 浏览数 (1)

以 JSON 格式为例,对 Go 的 struct 进行序列化与反序列化

代码语言:go复制
import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {

    // struct to json
	person := Person{
		Name: "Tom",
		Age:  10,
	}
	marshaled, err := json.Marshal(person)
	if err != nil {
		fmt.Printf("Error marsaling %sn", err)
		return
	}
	s := string(marshaled)
	fmt.Printf("Type: %T, Value:% vn", s, s)
}

    // json to struct
	person = Person{}
	if err = json.Unmarshal([]byte(strJSON), &person); err != nil {
		fmt.Printf("Error unmarsaling %sn", err)
		return
	}
	fmt.Printf("Type: %T, Value:% vn", person, person)
}

也可以对 map 类型进行序列化与反序列化

代码语言:go复制
func mapToJson(m map[string]interface{}) ([]byte, error) {
	marshaled, err := json.Marshal(m)
	if err != nil {
		fmt.Println("json encode failed, err:", err)
	}

	return marshaled, nil
}

func jsonToMap(b []byte) (map[string]interface{}, error) {
	var m map[string]interface{}
	err := json.Unmarshal(b, &m)
	if err != nil {
		fmt.Println("json decode failed, err:", err)
		return nil, err
	}
	return m, nil
}

但是 encoding/json 对于 map[string]interface 中的数字类型(整型、浮点型等)都序列化成float64类型。

可以使用 go 中自带另一种编码 gob 进行序列化或反序列化,可以保留原始数据格式

代码语言:go复制
import (
	"bytes"
	"encoding/gob"
	"fmt"
)

func mapToGob(m map[string]interface{}) ([]byte, error) {
	buf := new(bytes.Buffer)
	enc := gob.NewEncoder(buf)
	err := enc.Encode(m)
	if err != nil {
		fmt.Println("gob encode failed, err:", err)
		return nil, err
	}

	return buf.Bytes(), nil
}

func gobToMap(b []byte) (map[string]interface{}, error) {
	buf := bytes.NewBuffer(b)
	dec := gob.NewDecoder(buf)
	var m map[string]interface{}
	err := dec.Decode(&m)
	if err != nil {
		fmt.Println("gob decode failed, err:", err)
		return nil, err
	}
	return m, nil
}
go

0 人点赞