go序列化库--msgpack

news/2025/2/28 19:56:23/文章来源:https://www.cnblogs.com/guangdelw/p/18669460

简介

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 mainimport ("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 int8const (DRAFT Status = iotaPUBLISHED
)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 = &kreturn 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 Aif 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的更短

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868711.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图灵完备游戏介绍

怎么从软件到硬件 这个问题对于我来说很难理解。即使我本身是程序员,即使看了很多科普视频,但仍然不知道。硬件是不可变的,软件是多变的,怎么用不变实现变化? 我偶然间看了系统推荐的游戏视频,发现了这个游戏。于是就趁着无聊玩了下。这个游戏展现了怎么从硬件到软件。逻…

推荐4款基于.NET开源、功能强大的CMS建站系统

前言 CMS系统作为一种强大的内容管理工具,在数字化时代发挥着越来越重要的作用。无论是个人博客还是大型企业官网,选择一个合适的CMS都能极大地提高效率和用户体验。今天大姚给大家推荐4款基于.NET开源、免费、功能强大的CMS建站系统,希望可以帮助到有需要的同学。 SSCMS SS…

DVWA靶场CSP Bypass (漏洞绕过) 漏洞通关及源码审计

CSP Bypass CSP Bypass(Content Security Policy Bypass)漏洞涉及的是绕过网站部署的内容安全策略(Content Security Policy,CSP)限制,从而执行潜在的恶意操作。CSP 是一种安全机制,用于防止跨站脚本(XSS)、数据注入攻击等。其通过限制网页能够加载和执行的内容来源…

为你的Blazor程序加入本地化多语言功能

本地化 本地化是为给定语言和地区定制应用程序的过程. BootstrapBlazor 组件允许您将其 UI 元素转换为所需的语言。这包括按钮、过滤器操作符属性等文本。组件内部默认使用当前请求 UI 文化语言,本文将向您展示如何在应用程序中使用此功能: BootstrapBlazor 组件库 简介 Boot…

2024ICPC(香港)游记

转自MyBlog 虽然2025了再写好像有点迟就是了。 day -180? 大一xdx太nb导致的,本来预估网络赛400有两场,600校内出线,结果被xdx搞成网络赛200有两场,400校内出线。632遗憾退场。 day -100? 老师给南京站争取了一个外卡,可惜20分罚时之差给了我们前一队。这么说去年邀请赛…

AVL树的插入

关于AVL树的插入,其实是一个比较复杂的问题,主要是在于他对于“旋转”这一概念,对于这一概念其实我感觉很多博主讲的都不是很明白,包括CHATGPT,也试了,但是也没有比较清楚的解释,他们主要集中在一种比较简单的情况,即没有任何子树的情况,如下所示 ​​ 对于这种最基本…

【事件分析】20250112-Usual 赎回机制调整事件

背景信息 https://docs.usual.money/ Usual 是一个聚合 RWA 的稳定币发行协议,经济模型中存在三种代币:USD0:Usual 发行的稳定币。 USD0++:USD0++ 是 USD0 的质押版本,为期4年,可获得 USUAL 代币奖励。 USUAL:Usual 协议的治理代币。事发缘由 https://usual.money/blog/…

痞子衡嵌入式:我评上了2024年度电子星球(eestar)最强大脑

今天收到了「电源网旗下电子星球」 颁发的 2024 年度最强大脑奖牌,这是电子星球第二年给痞子衡颁奖了。这个奖牌设计得非常用心,区别于去年奖牌只能捧在手上,今年痞子衡可以把奖牌挂脖子上出去拉风了。从23年8月开始,电子星球小编每个工作日会转发一篇痞子衡的技术原创文章…

React源码解析(1): JSX语法与react项目渲染过程

好家伙0.前言 由于工作的需要,我不得不入手了react的全家桶,曾经我的主要技术栈是vue。 从vue转到react,一开始我感到非常不适应,jsx的语法的不了解,react hooks的使用方式,react路由的配置。。。这一度让我十分难受 但在熟悉一段时间后,我逐渐领略到react的魅力,灵活的…

痞子衡嵌入式:我拿到了2024年度电子星球(eestar)最强大脑

今天收到了「电源网旗下电子星球」 颁发的 2024 年度最强大脑奖牌,这是电子星球第二年给痞子衡颁奖了。这个奖牌设计得非常用心,区别于去年奖牌只能捧在手上,今年痞子衡可以把奖牌挂脖子上出去拉风了。从23年8月开始,电子星球小编每个工作日会转发一篇痞子衡的技术原创文章…

使用嗅探大师(sniff master)进行手机端iOS抓包的配置步骤

一个强大的iOS端抓包工具,嗅探大师(sniff master),比市面上的一些抓包工具操作更简单。之前做网页端开发的时候找到一个抓包工具,嗅探大师,当时用来在Windows上面进行抓包,发现他在手机端iOS方面的抓包更为强大,而且还有HTTPS暴力抓包,无需设置代理,无需越狱,无需ro…

keycloak~巧用client-scope实现token字段和userinfo接口的授权

keycloak中的client-scope允许你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定义scope/mapper,来实现粒度的控制,并且这个mapper可以控制添加到token,或者添加到userinfo端点,这两块…