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中Context使用源码解析

    Go中Context使用源码解析

    这篇文章主要为大家介绍了Go中Context使用源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • golang gorm的预加载及软删硬删的数据操作示例

    golang gorm的预加载及软删硬删的数据操作示例

    这篇文章主要介绍了golang gorm的预加载及软删硬删的数据操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 使用Gin框架处理表单数据的操作步骤

    使用Gin框架处理表单数据的操作步骤

    在 Web 应用开发中,表单是用户与服务器交互的重要手段,Gin 框架对表单处理提供了高效便捷的支持,包括数据绑定、验证等功能,在本篇博客中,我们将详细介绍如何使用 Gin 框架处理表单数据,涵盖基础操作与进阶技巧,帮助初学者全面掌握表单功能,需要的朋友可以参考下
    2024-11-11
  • Golang模拟令牌桶进行对访问的限流方式

    Golang模拟令牌桶进行对访问的限流方式

    这篇文章主要介绍了Golang模拟令牌桶进行对访问的限流方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang报“import cycle not allowed”错误的2种解决方法

    Golang报“import cycle not allowed”错误的2种解决方法

    这篇文章主要给大家介绍了关于Golang报"import cycle not allowed"错误的2种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以们下面随着小编来一起看看吧
    2018-08-08
  • go中switch语句的用法详解

    go中switch语句的用法详解

    在Go中的switch语句类似于C、C++、Java、JavaScript和PHP中的switch语句,不同之处在于它只执行匹配的case,因此不需要使用break语句,下面我们就一起来学习一下switch语句的具体使用吧
    2023-09-09
  • golang fmt占位符的使用详解

    golang fmt占位符的使用详解

    这篇文章主要介绍了golang fmt占位符的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go语言map用法实例分析

    Go语言map用法实例分析

    这篇文章主要介绍了Go语言map用法,实例分析了map的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go操作各大消息队列教程(RabbitMQ、Kafka)

    Go操作各大消息队列教程(RabbitMQ、Kafka)

    消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构,本文主要介绍了Go操作各大消息队列教程(RabbitMQ、Kafka),需要的朋友可以了解一下
    2024-02-02
  • 浅谈go中cgo的几种使用方式

    浅谈go中cgo的几种使用方式

    本文主要介绍了浅谈go中cgo的几种使用方式,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论