全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何使用Cereal库进行序列化_c++现代化的序列化库【教程】

Cereal序列化核心三步:引入头文件、定义serialize函数、选JSON/Binary/XML存档;它轻量纯头文件、无需预编译,支持容器/智能指针/版本控制/继承。

使用 Cereal 库进行 C++ 序列化,核心就三步:引入头文件、定义序列化函数、选择存档类型(JSON / Binary / XML)来读写。它轻量、头文件仅依赖、无需预编译或 IDL,是现代 C++ 项目中非常自然的序列化方案。

1. 快速接入 Cereal

Cereal 是纯头文件库,直接下载 cereal/include/cereal 目录,加到项目 include 路径即可。CMake 中可这样引入:

include_directories(${CMAKE_SOURCE_DIR}/third_party/cereal/include)

无需链接任何库,也不需要生成代码 —— 它靠 C++ 模板和 ADL(参数依赖查找)自动发现序列化逻辑。

2. 为自定义类添加序列化支持

最常用方式是在类内部或外部定义 serialize 成员函数或非成员函数,签名固定为:template void serialize(Archive& ar)

例如:

struct Person {
    std::string name;
    int age = 0;

    template
    void serialize(Archive& ar) {
        ar(CEREAL_NVP(name), CEREAL_NVP(age));
    }
};

CEREAL_NVP 是“命名变量包装器”,用于 JSON/XML 输出时保留字段名;二进制存档中可省略,直接写 ar(name, age) 也行。

若不想改类定义,也可用外部非成员函数(需声明为 friend 或放在同命名空间):

template
void serialize(Archive& ar, Person& p) {
    ar(CEREAL_NVP(p.name), CEREAL_NVP(p.age));
}

3. 选择存档类型并读写数据

Cereal 提供三种主流存档:

  • BinaryArchive:最快、体积最小,跨平台但不兼容不同字节序(通常本地用没问题)
  • JSONArchive:人类可读、跨语言友好,支持嵌套、注释(需开启宏),默认带字段名
  • XMLOutputArchive / XMLInputArchive:结构清晰,适合配置文件场景,但较冗余

写入示例(JSON):

std::ofstream os("person.json");
cereal::JSONOutputArchive ar(os);
ar(CEREAL_NVP(p)); // p 是 Person 实例

读取示例(自动推导类型):

std::ifstream is("person.json");
cereal::JSONInputArchive ar(is);
Person p2;
ar(CEREAL_NVP(p2));

4. 处理常见情况的小技巧

容器与智能指针:std::vector、std::map、std::unique_ptr 等开箱即用,无需额外定义(只要元素类型可序列化)。

版本控制:用 CEREAL_CLASS_VERSION(MyClass, 2) 声明版本,在 serialize 中用 ar(cereal::make_nvp("field", field)) + 条件逻辑做兼容。

忽略字段:用 cereal::make_nvp("ignored", cereal::binary_data(...)) 或更推荐——在 serialize 中跳过该字段(只读/写时条件判断)。

继承支持:基类需有虚析构函数,并在 serialize 中显式调用 ar(cereal::base_class(this))

基本上就这些。Cereal 不复杂但容易忽略细节:比如忘记加 template、误用 const 导致无法写入、或 JSON 读取前没检查文件是否存在。用熟之后,它比 Boost.Serialization 更清爽,比手写 JSON 解析更安全。


# js  # json  # 字节  # c++  # stream  # 配置文件  # red  # 命名空间  # 成员函数  # 析构函数  # include  # xml  # const  # void  # 指针  # 继承  # class  # map  # this  # ar  # 序列化  # 头文件  # 三步  # 中非  # 字段名  # 也不  # 是在  # 放在  # 并在  # 三种 


相关文章: 高防服务器租用首荐平台,企业级优惠套餐快速部署  大型企业网站制作流程,做网站需要注册公司吗?  html制作网站的步骤有哪些,iapp如何添加网页?  山东云建站价格为何差异显著?  Python多线程使用规范_线程安全解析【教程】  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在自有机房高效搭建专业网站?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  如何在IIS7中新建站点?详细步骤解析  网站制作新手教程,新手建设一个网站需要注意些什么?  如何用PHP快速搭建CMS系统?  网站按钮制作软件,如何实现网页中按钮的自动点击?  如何在VPS电脑上快速搭建网站?  如何通过万网虚拟主机快速搭建网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  潮流网站制作头像软件下载,适合母子的网名有哪些?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  MySQL查询结果复制到新表的方法(更新、插入)  简历在线制作网站免费版,如何创建个人简历?  公司网站的制作公司,企业网站制作基本流程有哪些?  制作网站外包平台,自动化接单网站有哪些?  如何做静态网页,sublimetext3.0制作静态网页?  如何获取PHP WAP自助建站系统源码?  如何快速搭建高效香港服务器网站?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Swift开发中switch语句值绑定模式  公司门户网站制作流程,华为官网怎么做?  如何在云主机上快速搭建网站?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  css网站制作参考文献有哪些,易聊怎么注册?  ,柠檬视频怎样兑换vip?  青岛网站建设如何选择本地服务器?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  详解jQuery中基本的动画方法  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何通过网站建站时间优化SEO与用户体验?  建站之星如何一键生成手机站?  如何在建站主机中优化服务器配置?  广东企业建站网站优化与SEO营销核心策略指南  c# 在高并发下使用反射发射(Reflection.Emit)的性能  网页设计网站制作软件,microsoft office哪个可以创建网页?    如何在建站之星绑定自定义域名?  开源网站制作软件,开源网站什么意思?  如何有效防御Web建站篡改攻击?  如何在云指建站中生成FTP站点?  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何快速选择适合个人网站的云服务器配置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。