Msgpack23:一个现代的、仅包含头文件的 C++ 库,用于 MessagePack 的序列化和反序列化
`msgpack23` 是一个现代的、仅包含头文件的 C++ 库,用于 MessagePack 序列化和反序列化。它基于 C++20 及以上版本,支持多种数据类型,包括 STL 容器、时间点和自定义类型。该库具有轻量级、易于使用的特点,通过模板和类型特征实现灵活的零依赖解决方案。用户只需包含头文件即可使用,通过 `pack` 和 `unpack` 函数进行序列化和反序列化操作。它还支持自定义类型的序列化,并提供性能和灵活性。
rwindegger/msgpack23
一个现代的、仅包含头文件的 C++ 库,用于 MessagePack 的序列化和反序列化。msgpack.org [c++23]
License
msgpack23
A modern, header-only C++ library for MessagePack serialization and deserialization.
Overview
msgpack23 是一个轻量级的库,它提供了一种直接的方法,用于将 C++ 数据结构序列化和反序列化为 MessagePack 格式。 它使用现代 C++ (面向 C++20 及更高版本) 编写,并利用模板和类型特征来提供灵活的、零依赖的解决方案,用于打包和解包各种数据类型。
Key Features
- Header-only:只需包含头文件即可开始使用——无需额外的构建步骤或依赖项。
- Modern C++:使用 C++ 特性(如 concepts)来处理容器、map、枚举、时间点和用户定义的类型。
- Extensible:允许您通过实现
pack和unpack成员函数来定义自定义类型,自动将它们集成到序列化管道中。 - Collection and Map Support:自动检测和序列化 STL 容器 (例如,
std::vector,std::map),无需额外工作。 - Time Point Support:原生支持序列化
std::chrono::time_point对象。 - Variety of Primitive Types:整数 (有符号/无符号)、布尔值、浮点数、
std::string、字节数组和nullptr均开箱即用。 - Endian-Aware:使用
std::endian和std::byteswap正确处理字节序,以确保可移植性。
Getting Started
- Clone the Repository
git clone https://github.com/rwindegger/msgpack23.git
- Include the Header 由于这是一个 header-only 的库,只需在您的项目中包含主头文件即可:
#include "msgpack23.hpp"
- Pack and Unpack
#include <iostream>
#include <map>
#include "msgpack23.hpp"
int main() {
// Create a map of some data
std::map<std::string, int> original {{"apple", 1}, {"banana", 2}};
// 1) Pack into a vector of std::byte
msgpack23::Packer packer;
auto packedData = packer(original);
// 2) Unpack back into a map
std::map<std::string, int> unpacked;
msgpack23::Unpacker unpacker(packedData);
unpacker(unpacked);
// Verify the result
for (auto const& [key, value] : unpacked) {
std::cout << key << ": " << value << "\n";
}
return 0;
}
Custom Types
要序列化您自己的类型,请定义一个 pack 和 unpack 函数。 pack 应该接受一个 T &, unpack 应该接受一个 T &。
struct MyData {
int64_t my_integer;
std::string my_string;
template<typename T>
std::vector<std::byte> pack(T &packer) const {
return packer(my_integer, my_string);
}
template<typename T>
void unpack(T &unpacker) {
unpacker(my_integer, my_string);
}
};
现在您可以像使用任何内置类型一样使用 MyData 和 msgpack23:
MyData const my_data {42, "Hello" };
auto const data = msgpack23::pack(my_data);
auto obj = msgpack23::unpack<MyData>(data);
Why msgpack23?
- Simplicity:一个带有清晰结构的打包/解包逻辑的单个头文件。
- Performance:通过使用直接内存操作和编译时类型推导来最小化开销。
- Flexibility:从原始类型和 STL 容器到自定义结构,一切都可以通过最少的样板进行序列化。
Contributing
欢迎贡献、错误报告和功能请求! 随时打开一个 issue 或者提交一个 pull request。
- Fork it!
- Create your feature branch:
git checkout -b feature/my-new-feature - Commit your changes:
git commit -am 'Add some feature' - Push to the branch:
git push origin feature/my-new-feature - Submit a pull request
License
该项目基于 MIT License 授权。
祝您打包(和解包)愉快! 如果您有任何问题或反馈,请打开一个 issue 或开始讨论。