简介
msgpack是一个基于二进制高效的对象序列化类库,可用于跨语言通信。
它可以像JSON那样,在许多种语言之间交换结构对象。
但是它比JSON更快速也更轻巧。 支持Python、Ruby、Java、C/C++、Go等众多语言。
宣称比Google Protocol Buffers还要快4倍。
官方的说法
它像 JSON,
但更快、更小巧。
MessagePack 是一种高效的二进制序列化格式。它允许您像 JSON 一样在多种语言之间交换数据,但速度更快、体积更小。
小整数被编码为单个字节,而典型的短字符串仅需在字符串本身之外额外占用一个字节。
官网
丰富的库
安装
go get github.com/vmihailenco/msgpack/v5
与json对比使用
package main
import (
"encoding/json"
"errors"
"fmt"
"github.com/vmihailenco/msgpack/v5"
"strings"
)
type A struct {
Title string `json:"title" msgpack:"title"`
Author string `json:"author" msgpack:"author"`
Summary string `json:"-" msgpack:"-"` // 忽略这个字段
Content string `json:"content,omitempty" msgpack:"content,omitempty"` // 当这个字段为空是,不序列化这个字段
// 这里省略了后面跟的Status,是可以正常使用的,但是如果实现了序列化的三个方法,会导致整个结构体只有status被序列化,其他的被忽略
Status Status `json:"status" msgpack:"status"`
}
// Status Status枚举
type Status int8
const (
DRAFT Status = iota
PUBLISHED
)
var (
StatusValueMap = map[Status]string{
DRAFT: "DRAFT",
PUBLISHED: "PUBLISHED",
}
)
// 实现 MarshalJSON 对枚举值进行转化
func (sta Status) MarshalJSON() ([]byte, error) {
if v, ok := StatusValueMap[sta]; ok {
return []byte(`"` + v + `"`), nil
}
return nil, errors.New("枚举未定义")
}
// 实现 UnmarshalJSON 对枚举值进行转化
func (sta *Status) UnmarshalJSON(data []byte) error {
s := strings.Trim(string(data), `"`)
for k, v := range StatusValueMap {
if v == s {
sta = &k
return nil
}
}
return errors.New("未转化成功")
}
// 实现String方法,方便打印查看
func (sta Status) String() string {
return StatusValueMap[sta]
}
func main() {
a := &A{Content: "aaaa"}
res1, err := json.Marshal(a)
if err != nil {
panic(err)
}
fmt.Printf("%+v %[1]T %d\n", res1, len(res1))
res2, err := msgpack.Marshal(a)
if err != nil {
panic(err)
}
fmt.Printf("%+v %[1]T %d\n", res2, len(res2))
var b A
if err := msgpack.Unmarshal(res2, &b); err != nil {
panic(err)
}
fmt.Printf("%+v\n", b)
}
从上面的例子可以看出,与json的使用方法无异
然后序列化的标签也是一样的
运行的而结果
[123 34 116 105 116 108 101 34 58 34 34 44 34 97 117 116 104 111 114 34 58 34 34 44 34 99 111 110 116 101 110 116 34 58 34 97 97 97 97 34 44 34 115 116 97 116 117 115 34 58 34 68 82 65 70 84 34 125] []uint8 58
[132 165 116 105 116 108 101 160 166 97 117 116 104 111 114 160 167 99 111 110 116 101 110 116 164 97 97 97 97 166 115 116 97 116 117 115 208 0] []uint8 38
{Title: Author: Summary: Content:aaaa Status:DRAFT}
可以看到确实比json的更短
标签:Status,msgpack,--,34,json,116,go,序列化,97 From: https://www.cnblogs.com/guangdelw/p/18669460