在C++开发中,将对象持久化保存到文本文件是常见需求。本文精选了4个高效、易用的序列化库,涵盖不同场景下的文本序列化方案,助你快速实现数据存储与传输。
一、Cereal(推荐指数:⭐⭐⭐⭐⭐)
核心特性
- 多格式支持:原生支持JSON、XML和二进制格式,其中JSON/XML可直接保存为可读文本文件
- 非侵入式设计:通过添加
serialize
模板函数实现序列化,无需修改现有类定义 - 轻量级:纯头文件库,无需编译即可集成
- 高性能:序列化速度比Protobuf快2-3倍(二进制模式下)
文本序列化示例
#include <cereal/archives/json.hpp>
#include <fstream>
struct UserProfile {
int id;
std::string name;
std::vector<std::string> tags;
template<class Archive>
void serialize(Archive& ar) {
ar(id, name, tags);
}
};
// 序列化到JSON文件
std::ofstream ofs("user.json");
cereal::JSONOutputArchive archive(ofs);
archive(userObj);
// 反序列化
UserProfile loaded;
std::ifstream ifs("user.json");
cereal::JSONInputArchive iarchive(ifs);
iarchive(loaded);
适用场景
- 需要人类可读的配置文件
- 跨平台数据交换(JSON/XML通用性)
- 快速原型开发
二、Boost.Serialization(推荐指数:⭐⭐⭐⭐)
核心优势
- 深度兼容性:支持STL容器、多态对象和版本控制
- 文本归档:提供
text_oarchive
生成结构化文本,但可读性低于JSON - 跨平台:已在Windows/Linux/macOS广泛验证
文本序列化示例
#include <boost/archive/text_oarchive.hpp>
class Employee {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int) {
ar & id & name;
}
public:
int id;
std::string name;
};
// 保存到文本文件
std::ofstream ofs("employee.txt");
boost::archive::text_oarchive oa(ofs);
oa << emp;
适用场景
- 复杂类层次结构序列化
- 需要版本控制的长期数据存储
- 已有Boost生态的项目
三、Protocol Buffers(推荐指数:⭐⭐⭐)
特色功能
- 跨语言支持:通过
.proto
定义数据结构,自动生成C++/Java/Python等代码 - 高效二进制+JSON:原生支持二进制,通过
protobuf-json
实现文本转换 - 强类型校验:编译时检查数据完整性
文本转换示例
// user.proto
syntax = "proto3";
message User {
int32 id = 1;
string name = 2;
repeated string tags = 3;
}
// 二进制转JSON文本
user.SerializeToOstream(&binary_output);
google::protobuf::util::JsonPrintOptions options;
options.add_whitespace = true;
MessageToJsonString(user, &json_text, options);
适用场景
- 多语言协作系统
- 网络通信协议
- 需要严格数据约束的场景
四、RapidJSON(推荐指数:⭐⭐⭐)
特殊优势
- 纯JSON处理:专为JSON设计,支持SAX/DOM两种解析模式
- 极致性能:比常规JSON库快10倍以上
- 手动控制:适合需要精细优化JSON结构的场景。
示例片段
rapidjson::Document doc;
doc.SetObject();
doc.AddMember("id", 123, doc.GetAllocator());
// 写入文本文件
rapidjson::StringBuffer buffer;
rapidjson::Writer writer(buffer);
doc.Accept(writer);
std::ofstream("data.json") << buffer.GetString();
适用场景
- 纯JSON数据处理
- 高频小数据量序列化
- 需要定制化JSON结构的场景
综合对比建议
库名称 | 文本可读性 | 开发效率 | 性能 | 学习成本 |
---|---|---|---|---|
Cereal | 高(JSON/XML) | 高 | 高 | 低 |
Boost | 中(text) | 中 | 中 | 中 |
Protobuf | 需转换 | 低 | 极高 | 高 |
RapidJSON | 高(JSON) | 低 | 极高 | 中 |
选型指南:
- 首选Cereal:平衡易用性与功能,适合大多数文本序列化场景
- 选择Protobuf:需要跨语言支持或极致性能
- 使用Boost:已有Boost依赖或复杂类层次结构
- 考虑RapidJSON:需要完全控制JSON结构
📦 硬核资料赠送
关注私信>>「C++王者」获取以下资源:
-
《C++后端开发高频八股文》
涵盖23个核心考点,助你轻松应对面试! -
《C/C++工程师能力自测清单》
50+项技能树Checklist,快速定位技术短板! -
【开源项目】libevent-master
高性能网络库源码,深入理解事件驱动编程! -
【开源项目】workflow-master
现代C++异步任务调度框架,提升开发效率! -
《LeetCode 101算法精讲》
剑指Offer最优解合集,算法刷题必备神器!
关注我,获取更多C++硬核知识! 🚀