C++对象序列化库推荐:轻松实现数据持久化到文本文件

在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++王者」获取以下资源:

  1. 《C++后端开发高频八股文》
    涵盖23个核心考点,助你轻松应对面试!

  2. 《C/C++工程师能力自测清单》
    50+项技能树Checklist,快速定位技术短板!

  3. 【开源项目】libevent-master
    高性能网络库源码,深入理解事件驱动编程!

  4. 【开源项目】workflow-master
    现代C++异步任务调度框架,提升开发效率!

  5. 《LeetCode 101算法精讲》
    剑指Offer最优解合集,算法刷题必备神器!


关注我,获取更多C++硬核知识! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言小火车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值