适用于C++ / Go / Python的极简主义跨语言序列化库集
项目描述
fastmsg
fastmsg是一组跨语言序列化库。
目前支持以下语言
内容
动机
为什么还需要另一个序列化库?让我解释为什么不是protobuf、flatbuffers、msgpack等。
- 🟢 无依赖。
fastmsg除了标准库外没有其他依赖。 - 🟢 无模式。
fastmsg是无模式的。您在序列化数据之前不需要定义模式。这在您想序列化简单数据结构而不需要定义模式的开销时非常有用。 - 🟢 智能指针友好。
MessagePtr
是Message的智能指针,它管理底层数据缓冲区的生命周期。 - 🟢 消息拥有缓冲区。
MessagePtr
保持自己的缓冲区,所以您不必担心缓冲区的生命周期。例如,从函数返回一个MessagePtr
对象是完全可以的。在其他库中,您必须自己管理缓冲区的生命周期。请别误会,我喜欢protobuf和flatbuffers,但它们在序列化简单数据结构时太啰嗦了。 - 🟢 与GCC & MinGW兼容。
fastmsg与GCC和MinGW兼容,因此您可以在Windows上使用它而没有任何问题。 - 🟢 内存安全。在运行时检查常见的错误,如缓冲区溢出。这在从格式不正确的消息或不可信来源的数据反序列化时特别有用。
现在,在开始使用fastmsg之前,有一些重要的事项需要考虑
- 🔴 无模式。
再次强调,如果您需要模式,fastmsg可能不适合您。 - 🔴 无自定义类型。
fastmsg 仅支持有限的几种原生类型:整数、字符串、字节向量和嵌套消息。例如,字典也不受支持!为什么?因为你可以很容易地将字典的键和值分别序列化。一切尽在您的掌握之中! - 🔴 无错误处理。
fastmsg 不提供错误处理。如果发生错误,将返回默认值(例如,整数返回 0,字符串返回空字符串等)。 - 🔴 无类型安全。
fastmsg 不是类型安全的。您必须知道您正在读取的数据类型。 - 🔴 无向后兼容性。
fastmsg 未设计为向后兼容。如果您需要向后兼容,您应考虑使用其他库。
为什么不是 X?
- ❔ protobuf:依赖于 absl,静态链接很麻烦。
- ❔ flatbuffers:不管理缓冲区的生命周期,需要您通过编写更多样板代码来自己管理。
- ❔ msgpack:依赖于 boost,对于简单的数据结构,代码看起来太冗长。
有效载荷格式
以下是一个示例有效载荷,其中包含一个字符串、一个整数、一个字节向量和一个嵌套消息。所有具有动态长度(例如,字符串、字节向量和嵌套消息)的值都带有其长度前缀。
05 00 00 00 48 65 6C 6C 6F 2A 00 03 00 00 00 22 0D 25 12 00 00 00 06 00 00 00 4E 65 73 74 65 64 AB 5B FF FF FF FF FF FF
[
0x05, 0x00, 0x00, 0x00, # String length (5)
0x48, 0x65, 0x6C, 0x6C, 0x6F, # String ("Hello")
0x2A, 0X00, # 16-bit unsigned int (42)
0x03, 0x00, 0x00, 0x00, # Byte vector length (3)
0x22, 0x0D, 0x25, # Byte vector ([34, 13, 37])
0x12, 0x00, 0x00, 0x00, # Nested message length (18)
0x06, 0x00, 0x00, 0x00, # String length (6)
0x4E, 0x65, 0x73, 0x74, 0x65, 0x64, # String ("Nested")
0xAB, 0x5B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF # 64-bit int (-42069)
]
示例用法
C++
安装:只需将 message.h 和 message.cpp 复制到您的项目中。
序列化
#include <fastmsg/message.h>
// ...
MessagePtr msg = std::make_shared<Message>();
msg->add("Hello");
msg->add(static_cast<uint16_t>(42));
msg->add(std::vector<uint8_t>{34, 13, 37});
MessagePtr msgNested = std::make_shared<Message>();
msgNested->add("Nested")->add(static_cast<int64_t>(-42069)); // Chaining is supported
msg->add(msgNested);
std::vector<uint8_t> buffer = msg->seal();
// Send buffer over network, write to file, etc.
}
反序列化
#include <fastmsg/message.h>
// ...
MessagePtr msg = std::make_shared<Message>(buffer);
std::string str = msg->readString();
uint16_t num = msg->readUInt16();
std::vector<uint8_t> vec = msg->readBytes();
MessagePtr msgNested = msg->readMessage();
std::string strNested = msgNested->readString();
int64_t numNested = msgNested->readInt64();
Go
安装
go get github.com/and3rson/fastmsg/go
序列化
import "github.com/and3rson/fastmsg/go"
msg := NewMessage()
msg.AddString("Hello")
msg.AddUInt16(42)
msg.AddBytes([]byte{34, 13, 37})
msgNested := NewMessage()
msgNested.AddString("Nested").AddInt64(-42069) // Chaining is supported
msg.AddMessage(msgNested)
buffer := msg.Seal()
反序列化
import "github.com/and3rson/fastmsg/go"
msg := NewMessageFromBuffer(buffer)
s := msg.ReadString()
u := msg.ReadUInt16()
b := msg.ReadBytes()
msgNested := msg.ReadMessage()
sNested := msgNested.ReadString()
iNested := msgNested.ReadInt64()
Python
安装
pip install fastmsg
序列化
from fastmsg import Message
msg = Message()
msg.add_string("Hello")
msg.add_uint16(42)
msg.add_bytes(bytes([34, 13, 37]))
msg_nested = Message()
msg_nested.add_string("Nested").add_int64(-42069) # Chaining is supported
msg.add_message(msg_nested)
buffer = msg.seal()
反序列化
from fastmsg import Message
msg = Message(buffer)
s = msg.read_string()
u = msg.read_uint16()
b = msg.read_bytes()
msg_nested = msg.read_message()
s_nested = msg_nested.read_string()
i_nested = msg_nested.read_int64()
运行测试
make test
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。
源分发
fastmsg-1.0.0.tar.gz (5.0 kB 查看散列)
构建分发
fastmsg-1.0.0-py3-none-any.whl (5.1 kB 查看散列)
关闭
fastmsg-1.0.0.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | aec1a66bc47c8b33426c0cfddcf007567d750924b0bace73225caa60119d93a8 |
|
MD5 | 2000bb5811bc16dc457f3bdda2c63651 |
|
BLAKE2b-256 | 885617c04fd0fa0d0a789dcfa9464218f1e197a92915ba419ad43d5f7ffdeb38 |
关闭
fastmsg-1.0.0-py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 889137915e6b163431828cface4ca326f93c552e220c74b9da2d1bb8493789df |
|
MD5 | 2dcbb6491581123636c6546e4a18c99d |
|
BLAKE2b-256 | 8c84bac2b0293eff9d45a818bb562f88e527857f0725ef9af6aff6fa52fe8a1b |