Go語言消息序列化 JSON、ProtoBuf與MsgPack對比
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. 序列化對比
| 特性 | JSON | ProtoBuf | MsgPack |
|---|---|---|---|
| 體積 | 大 | 小 | 中 |
| 速度 | 慢 | 快 | 快 |
| 可讀性 | 好 | 差 | 差 |
| 跨語言 | 好 | 好 | 好 |
| Schema | 無 | 有 | 無 |
6. 總結(jié)
本文對比了三種序列化方式的特點和Go語言實現(xiàn),開發(fā)者應(yīng)根據(jù)具體場景選擇合適的序列化方式。
到此這篇關(guān)于Go語言消息序列化 JSON、ProtoBuf與MsgPack對比的文章就介紹到這了,更多相關(guān)Go語言 JSON ProtoBuf MsgPack內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式
這篇文章主要介紹了go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Golang通道阻塞情況與通道無阻塞實現(xiàn)小結(jié)
本文主要介紹了Golang通道阻塞情況與通道無阻塞實現(xiàn)小結(jié),詳細解析了通道的類型、操作方法以及垃圾回收機制,從基礎(chǔ)概念到高級應(yīng)用,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Golang 實現(xiàn)復(fù)制文件夾同時復(fù)制文件
這篇文章主要介紹了Golang 實現(xiàn)復(fù)制文件夾同時復(fù)制文件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

