在C++开发中,将对象持久化保存到文本文件是常见需求。本文精选了4个高效、易用的序列化库,涵盖不同场景下的文本序列化方案,助你快速实现数据存储与传输。
serialize
模板函数实现序列化,无需修改现有类定义#include
#include
struct UserProfile {
int id;
std::string name;
std::vector tags;
template
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);
text_oarchive
生成结构化文本,但可读性低于JSON#include
class Employee {
friend class boost::serialization::access;
template
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;
.proto
定义数据结构,自动生成C++/Java/Python等代码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::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();
库名称 | 文本可读性 | 开发效率 | 性能 | 学习成本 |
---|---|---|---|---|
Cereal | 高(JSON/XML) | 高 | 高 | 低 |
Boost | 中(text) | 中 | 中 | 中 |
Protobuf | 需转换 | 低 | 极高 | 高 |
RapidJSON | 高(JSON) | 低 | 极高 | 中 |
选型指南:
硬核资料赠送
关注私信>>「C++王者」获取以下资源:
《C++后端开发高频八股文》
涵盖23个核心考点,助你轻松应对面试!
《C/C++工程师能力自测清单》
50+项技能树Checklist,快速定位技术短板!
【开源项目】libevent-master
高性能网络库源码,深入理解事件驱动编程!
【开源项目】workflow-master
现代C++异步任务调度框架,提升开发效率!
《LeetCode 101算法精讲》
剑指Offer最优解合集,算法刷题必备神器!
关注我,获取更多C++硬核知识!