跳转到主要内容

适用于C++ / Go / Python的极简主义跨语言序列化库集

项目描述

fastmsg

fastmsg是一组跨语言序列化库。

Tests Go Reference

目前支持以下语言

内容

动机

为什么还需要另一个序列化库?让我解释为什么不是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.hmessage.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 查看散列)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面