Go语言消息序列化 JSON、ProtoBuf与MsgPack对比

 更新时间:2026年05月10日 11:54:36   作者:码龙大大  
本文对比了三种序列化方式的特点和Go语言实现,开发者应根据具体场景选择合适的序列化方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 序列化重要性

消息队列中,序列化方式直接影响消息体积、传输效率和易用性。常用的序列化方式包括JSON、Protocol Buffers和MessagePack。

2. JSON序列化

type JSONSerializer struct{}

func (s *JSONSerializer) Serialize(v interface{}) ([]byte, error) {
    return json.Marshal(v)
}

func (s *JSONSerializer) Deserialize(data []byte, v interface{}) error {
    return json.Unmarshal(data, v)
}

type JSONMessage struct {
    Topic string
    Key   string
    Value interface{}
}

func (j *JSONMessage) Serialize() ([]byte, error) {
    return json.Marshal(j)
}

func DeserializeJSONMessage(data []byte) (*JSONMessage, error) {
    var msg JSONMessage
    err := json.Unmarshal(data, &msg)
    if err != nil {
        return nil, err
    }
    return &msg, nil
}

3. Protocol Buffers序列化

syntax = "proto3";

package message;

option go_package = "./;message";

message Person {
    string name = 1;
    int32 age = 2;
    string email = 3;
}

message Message {
    string topic = 1;
    string key = 2;
    bytes value = 3;
    int64 timestamp = 4;
}

message BatchMessage {
    repeated Message messages = 1;
}
package protobuf

import (
    "fmt"

    "github.com/golang/protobuf/proto"
)

type ProtoSerializer struct{}

func (s *ProtoSerializer) Serialize(v proto.Message) ([]byte, error) {
    return proto.Marshal(v)
}

func (s *ProtoSerializer) Deserialize(data []byte, v proto.Message) error {
    return proto.Unmarshal(data, v)
}

type Message struct {
    Topic     string `protobuf:"bytes,1,opt,name=topic"`
    Key       string `protobuf:"bytes,2,opt,name=key"`
    Value     []byte `protobuf:"bytes,3,opt,name=value"`
    Timestamp int64  `protobuf:"varint,4,opt,name=timestamp"`
}

func (m *Message) Reset()         {}
func (m *Message) String() string { return fmt.Sprintf("%v", *m) }
func (m *Message) ProtoMessage()  {}

4. MessagePack序列化

package msgpack

import (
    "github.com/vmihailenco/msgpack/v5"
)

type MsgPackSerializer struct{}

func (s *MsgPackSerializer) Serialize(v interface{}) ([]byte, error) {
    return msgpack.Marshal(v)
}

func (s *MsgPackSerializer) Deserialize(data []byte, v interface{}) error {
    return msgpack.Unmarshal(data, v)
}

type Message struct {
    Topic     string
    Key       string
    Value     []byte
    Timestamp int64
}

func (m *Message) Encode() ([]byte, error) {
    return msgpack.Marshal(m)
}

func DecodeMessage(data []byte) (*Message, error) {
    var m Message
    err := msgpack.Unmarshal(data, &m)
    if err != nil {
        return nil, err
    }
    return &m, nil
}

5. 序列化对比

特性JSONProtoBufMsgPack
体积
速度
可读性
跨语言
Schema

6. 总结

本文对比了三种序列化方式的特点和Go语言实现,开发者应根据具体场景选择合适的序列化方式。

到此这篇关于Go语言消息序列化 JSON、ProtoBuf与MsgPack对比的文章就介绍到这了,更多相关Go语言 JSON ProtoBuf MsgPack内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go类型转换及与C的类型转换方式

    go类型转换及与C的类型转换方式

    这篇文章主要介绍了go类型转换及与C的类型转换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • go-zero rpc分布式微服务使用详解

    go-zero rpc分布式微服务使用详解

    文章介绍了如何安装Go环境、配置Go环境、安装goctl工具以及创建第一个项目,详细的步骤包括生成项目、配置文件、启动服务、测试项目等,文章还涵盖了Go Zero框架的基本概念,如API定义、服务间通信、业务逻辑实现等
    2026-01-01
  • Golang通道阻塞情况与通道无阻塞实现小结

    Golang通道阻塞情况与通道无阻塞实现小结

    本文主要介绍了Golang通道阻塞情况与通道无阻塞实现小结,详细解析了通道的类型、操作方法以及垃圾回收机制,从基础概念到高级应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • go中空接口的具体使用

    go中空接口的具体使用

    空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 深入分析golang多值返回以及闭包的实现

    深入分析golang多值返回以及闭包的实现

    相对于C/C++,golang有很多新颖的特性,例如goroutine,channel等等,这些特性其实从golang源码是可以理解其实现的原理。今天这篇文章主要来分析下golang多值返回以及闭包的实现,因为这两个实现golang源码中并不存在,我们必须从汇编的角度来窥探二者的实现。
    2016-09-09
  • Go语言中Timer计时器的使用技巧详解

    Go语言中Timer计时器的使用技巧详解

    Go语言中的time包里有个Timer计时器的功能,这篇文章主要就是来和大家介绍一下Timer计时器的使用技巧,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • go mod tidy加载模块超时的问题及解决

    go mod tidy加载模块超时的问题及解决

    go mod tidy加载模块超时的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • golang字符串转Time类型问题

    golang字符串转Time类型问题

    本文主要介绍了golang字符串转Time类型问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • go语言获取系统盘符的方法

    go语言获取系统盘符的方法

    这篇文章主要介绍了go语言获取系统盘符的方法,涉及Go语言调用winapi获取系统硬件信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Golang 实现复制文件夹同时复制文件

    Golang 实现复制文件夹同时复制文件

    这篇文章主要介绍了Golang 实现复制文件夹同时复制文件,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论