Go: 序列化与反序列化

Go的序列化

特性

  • Go通过结构体标签来支持序列化和反序列化,内置的encoding标准库支持xml/json等配置文件的序列化和反序列化
  • gopls本身支持json结构体标签的快速生成
  • Go只会对一个结构体的公有字段进行序列化和反序列化

API

  • 通过encoding下的子包encoding/xmlencoding/jsonAPI
  • Marshal(v any) ([]byte, error):将任意值序列化,返回字节数组
  • MarshalIndent(v any) ([]byte, error):类似Marshal()但是会提供缩进美化
  • Unmarshal(data []byte, v any) error:反序列化,v应当是指针

xml-etree

yaml

  • 需要借助第三方库go-yaml/yaml
  • 用法与encoding API一致,只不过yaml是严格缩进的,因此没有MarshalIndent()
  • 切片和yaml数组对应
  • 一个结构体会将yaml的子属性和公有字段对应,只收集匹配成功的,会忽略无法匹配的项,若没有配置则使用零值赋值
  • 一个map会将所有该字段下的子字段全部收集起来,收集到和值类型相匹配的,如果存在和值类型不匹配的字段则报错

protobuf