文章目录
一、介绍
1.1 cereal 介绍
cereal is a header-only C++11 serialization library. cereal takes arbitrary data types and reversibly turns them into different representations, such as compact binary encodings, XML, or JSON. cereal was designed to be fast, light-weight, and easy to extend - it has no external dependencies and can be easily bundled with other code or used standalone.
- cereal是一个只包含头文件的C++11序列化库
- cereal支持任何类型的数据并可以将其序列化为不同形式,例如:二进制、XML或者JSON。
- cereal的设计理念是快速、轻量级和容易扩展;cereal没有依赖第三库而且可以轻易的将其和其他代码相。
- 项目使用cereal的原因:(需求)
- 给WEB用:JSON
- 给后端用:C++对象(不够贴切)(成员变量自动序列化成JSON)
1.2 cereal 资料
-
评论:没用过msgpack吧,网络、数据库、配置+多语言,一套方案解决 回复:哈哈 msgpack
确实短小精悍,我有个项目要关RTTI,cereal搞得要死要活搞不定,msgpack轻松解决了。。
问题:
- cereal 是什么?是哪个团队创建和维护的?相比同类型其他库表现怎么样?
- cereal 依赖什么?
- cereal 怎么使用?
二、常见的序列化库
以下是您列出的序列化和数据交换格式库的简要介绍:
-
Apache Thrift
- 特点:由Facebook开发,是一个完整的RPC(远程过程调用)框架,用于构建跨语言的服务通信。
- 格式:二进制,也支持JSON和Compact Protocol。
- 优点:支持多种语言,有强大的IDL(接口定义语言)和编译器。
- 用途:广泛应用于构建分布式系统的微服务架构。
-
Protocol Buffers (protobuf)
- 特点:由Google开发,用于序列化结构化数据,类似于XML,但更小、更快、更简单。
- 格式:二进制。
- 优点:高性能,跨语言支持,有成熟的工具链。
- 用途:常用于网络通信、数据交换和持久化存储。
-
Boost.Serialization
- 特点:是Boost库的一部分,提供序列化和反序列化机制,支持多种格式。
- 格式:二进制、XML、JSON等。
- 优点:功能强大,可以序列化复杂类型。
- 用途:适用于需要灵活序列化机制的项目。
-
MessagePack
- 特点:一种高效、紧凑的二进制序列化格式,旨在替代JSON。
- 格式:二进制。
- 优点:比JSON更小,解析速度更快。
- 用途:适用于对数据大小和解析速度敏感的场景。
-
cereal
- 特点:一个轻量级、高性能的序列化库,仅包含头文件。
- 格式:二进制、XML、JSON。
- 优点:易于使用,性能好,无外部依赖。
- 用途:适用于需要快速集成序列化能力的项目。
-
Apache Avro
- 特点:一个数据序列化系统,支持动态模式和静态模式。
- 格式:二进制。
- 优点:动态模式无需编译,静态模式提供高性能。
- 用途:常用于Hadoop生态系统和数据交换。
-
Cap’n Proto
- 特点:一种高效的序列化协议,专注于零拷贝访问。
- 格式:二进制。
- 优点:极高的性能,适合大数据量传输。
- 用途:适用于需要高性能序列化和内存效率的应用。
-
Flatbuffers
- 特点:由Google开发,专注于直接访问序列化数据,无需解析。
- 格式:二进制。
- 优点:高性能,零拷贝访问。
- 用途:适用于游戏开发和其他需要直接访问数据的场景。
-
YAS (Yet Another Serialization Library)
- 特点:一个高性能的C++序列化库,专注于速度和易用性。
- 格式:二进制。
- 优点:零拷贝序列化,非常快。
- 用途:适用于对序列化性能有严格要求的场景。
每个库都有其独特的优势和适用场景,选择哪个库应根据项目需求、性能要求、跨语言支持、以及团队熟悉度等因素来决定。例如,如果你在构建一个跨语言的微服务架构,可能更倾向于使用Apache Thrift;而如果你在构建一个高性能的游戏引擎,则Flatbuffers或Cap’n Proto可能是更好的选择。
三、cereal 使用
3.1 官网demo
// type support
#include <cereal/types/map.hpp>
#include <cereal/types/vector.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/complex.hpp>
// for doing the actual serialization
#include <cereal/archives/json.hpp>
#include <iostream>
class Stuff
{
public:
Stuff() = default;
void fillData()
{
data = { {"real", { {1.0f, 0},
{2.2f, 0},
{3.3f, 0} }},
{"imaginary", { {0, -1.0f},
{0, -2.9932f},
{0, -3.5f} }} };
}
private:
std::map<std::string, std::vector<std::complex<float>>> data;
friend class cereal::access;
template <class Archive>
void serialize( Archive & ar )
{
ar( CEREAL_NVP(data) );
}
};
int main()
{
cereal::JSONOutputArchive output(std::cout); // stream to cout
Stuff myStuff;
myStuff.fillData();
output( cereal::make_nvp("best data ever", myStuff) );
}
五、其他资料
5.1 C++ 高性能序列化库推荐
在C++中,有许多高性能的序列化库可供选择,这些库各有特色,适用于不同的场景。以下是一些值得推荐的高性能序列化库:
-
cereal
- 特点:轻量级、零依赖的头文件库,支持C++11及以上标准,能够序列化各种类型的数据到二进制、XML或JSON格式。
- 官网:GitHub
-
Binn
- 特点:轻量级、高效的数据序列化库,适用于C和C++,支持多种数据类型,如字典、列表、整数、浮点数和字符串。
- 官网:GitHub
-
ThorsSerializer
- 特点:提供二进制序列化,拥有快速的性能和丰富的功能,适用于需要高效序列化的场景。
- 官网:GitHub
-
MessagePack for C++
- 特点:基于MessagePack协议,是一个高效的二进制序列化库,支持多种语言,C++版本性能优异。
- 官网:GitHub
-
FlatBuffers
- 特点:由Google开发,提供零拷贝序列化和反序列化,非常适合实时通信和大数据量的应用。
- 官网:GitHub
-
Cap’n Proto
- 特点:提供高性能的序列化和RPC框架,特别适合大规模分布式系统。
- 官网:GitHub
-
Kapok
- 特点:高性能的序列化/反序列化库,专为C++设计,提供与messagepack相当的性能。
- 官网:博客园(注意,该链接为一篇博客文章,可能并非官方主页)
-
nlohmann/json
- 特点:虽然主要是JSON库,但在序列化和反序列化方面性能优秀,易于使用。
- 官网:GitHub
-
Fast-CPP-CSV-Parser
- 特点:专注于CSV格式的高效解析和生成,如果你的工作涉及到CSV文件,这是一个不错的选择。
- 官网:GitHub
-
Succinct
- 特点:提供紧凑和高效的二进制序列化,适用于需要最小化数据大小的场景。
- 官网:GitHub
选择合适的序列化库时,请考虑你的项目需求,比如性能、数据格式、跨平台能力、依赖管理和许可证兼容性等。每种库都有其优势和局限,选择最适合你项目需求的那一个。
5.2 C++ 对象序列化为二进制或文本格式的库有哪些
C++中存在多个库可以用于将对象序列化为二进制或文本格式,这取决于你的具体需求,如性能、兼容性、易用性、跨平台支持等。以下是一些流行的C++序列化库:
-
Boost.Serialization
- 特点:作为Boost库的一部分,提供深度集成的序列化解决方案,支持多种格式和流。
- 格式:二进制、XML、文本等。
- 优点:成熟稳定,功能丰富,支持复杂类型的序列化。
- 缺点:可能较为复杂,对于简单任务来说可能有些冗余。
-
cereal
- 特点:轻量级、高性能,仅包含头文件,易于集成。
- 格式:二进制、XML、JSON。
- 优点:简单易用,没有外部依赖,性能优秀。
- 缺点:相对年轻,社区可能不如Boost大。
-
Protocol Buffers (protobuf)
- 特点:由Google开发,广泛用于网络通信和数据存储。
- 格式:二进制。
- 优点:高性能,跨语言支持,工具链完善。
- 缺点:需要IDL描述文件和编译步骤,增加构建复杂度。
-
FlatBuffers
- 特点:同样由Google开发,专注于内存效率和速度。
- 格式:二进制。
- 优点:直接在二进制数据上进行访问,无需解析和复制。
- 缺点:也需要IDL描述文件,学习曲线略陡峭。
-
MessagePack
- 特点:高效且轻量的序列化库,支持多种语言。
- 格式:二进制。
- 优点:比JSON更快,更小的编码。
- 缺点:可能不如protobuf那么成熟。
-
Cap’n Proto
- 特点:高性能的序列化库,专为零拷贝访问设计。
- 格式:二进制。
- 优点:非常快速,适合大数据量和实时应用。
- 缺点:学习和使用相对复杂。
-
jsoncpp
- 特点:用于JSON数据的序列化和反序列化。
- 格式:JSON。
- 优点:成熟稳定,功能全面。
- 缺点:可能不如nlohmann/json等库轻量级。
-
nlohmann::json
- 特点:现代C++的JSON库,易于使用。
- 格式:JSON。
- 优点:简单易用,性能良好。
- 缺点:仅限于JSON格式。
-
RapidJSON
- 特点:专注于速度和内存效率的JSON库。
- 格式:JSON。
- 优点:非常快,内存使用效率高。
- 缺点:仅限于JSON,使用SAX风格API。
-
YAS (Yet Another Serialization Library)
- 特点:高性能、零拷贝的序列化库。
- 格式:二进制。
- 优点:速度快,内存效率高。
- 缺点:可能不如一些库那样广泛使用。
选择正确的库取决于你的具体需求,比如是否需要跨语言支持、性能要求、是否愿意承担额外的构建步骤等。对于简单的序列化需求,如配置文件存储,轻量级的库如cereal或nlohmann::json可能就足够了。而对于高性能或大规模数据交换,protobuf或FlatBuffers可能是更好的选择。