在C++项目开发中,序列化是数据存储、网络传输、配置持久化的核心刚需。传统Boost.Serialization库存在性能孱弱、编译臃肿、依赖繁重等问题,而今天给大家推荐的YAS(Yet Another Serialization)开源序列化库,完美解决了这些痛点。本文将从零讲解YAS的核心优势、环境搭建、实战代码、多格式序列化实现及性能对比,手把手教大家接入这款轻量、高性能、无依赖的C++序列化库。
一、YAS库是什么?
YAS 全称Yet Another Serialization,是一款由 niXman 开发的开源、轻量级、高性能C++序列化库,核心设计初衷是替代笨重、低效的 Boost.Serialization,为C++开发者提供零依赖、高速度、易集成的序列化解决方案。
不同于市面上厚重的Protobuf、FlatBuffers,也区别于功能简陋的简易序列化工具,YAS 主打轻量化、高性能、零侵入、多格式兼容,广泛适用于服务端开发、嵌入式设备、游戏网络通信、数据持久化等各类C++业务场景。
开源地址:https://github.com/abique/yas
二、YAS核心核心优势(吊打传统序列化方案)
1. 极致轻量:纯Header-Only,零第三方依赖
YAS 全程采用头文件开发,无需编译静态库/动态库,无需依赖Boost、OpenSSL等第三方组件,只需将头文件引入项目即可直接使用,极大降低了项目集成成本,适配Windows、Linux、MacOS、嵌入式等全平台编译部署场景。
2. 性能顶尖:远超Boost.Serialization
YAS 针对性优化了序列化编码逻辑,规避了Boost.Serialization冗余的校验和封装逻辑,官方基准测试显示:YAS序列化/反序列化速度大幅领先Boost.Serialization,二进制序列化效率接近Cista、FlatBuffers等高性能库,完美适配高并发、低延迟的服务端场景。
3. 多格式全覆盖,灵活适配业务
支持主流三种序列化归档格式,可按需切换,适配不同业务需求:
二进制格式:体积最小、速度最快,适用于网络传输、高速数据存储,支持跨字节序兼容
文本格式:可读性强,适合简单配置数据持久化
JSON格式:适配通用数据交互场景,支持跨语言数据对接
4. 低侵入设计,兼容现代C++
同时支持侵入式、非侵入式两种序列化写法,无需大幅改造原有业务结构体;兼容 C++11 及以上所有现代C++标准,支持STL容器、自定义结构体、嵌套对象、基础数据类型等绝大多数C++数据类型。
5. 跨平台、跨字节序兼容
二进制归档天然支持大小端自适应,不同架构设备(x86、ARM)之间数据序列化传输无乱码、解析异常问题,完美适配嵌入式、分布式跨设备通信场景。
三、环境快速搭建(超简单)
1. 环境要求
C++ 编译器:支持C++11及以上(GCC4.8+、Clang、VS2015+)
无任何第三方库依赖,纯原生C++实现
2. 快速集成步骤
克隆YAS开源源码到本地:
git clone https://github.com/abique/yas.git将项目内的
include/yas文件夹复制到自己的项目头文件目录编译项目时开启C++11及以上标准,直接引入头文件即可使用
CMake项目可直接配置头文件路径,无需额外编译链接配置,集成零成本。
四、YAS实战代码示例(核心场景)
下面通过最常用的自定义结构体二进制序列化、JSON序列化实战案例,快速上手YAS核心用法。
示例1:基础结构体二进制序列化(非侵入式)
非侵入式无需修改结构体源码,适合存量业务结构体快速接入,是项目中最常用的写法。
#include <iostream> #include <string> // 引入YAS二进制序列化头文件 #include "yas/archive/binary.hpp" // 自定义业务结构体 struct UserInfo { int id; std::string name; double score; bool is_valid; }; // YAS非侵入式序列化注册 namespace yas { template<typename Archive> void serialize(Archive &ar, UserInfo &u) { ar & u.id; ar & u.name; ar & u.score; ar & u.is_valid; } } // namespace yas int main() { // 1. 构建原始数据 UserInfo src_user{1001, "YAS开源库", 98.5, true}; // 2. 二进制序列化:对象转字节流 yas::binary_oarchive oar; oar & src_user; std::string bin_data = oar.str(); std::cout << "序列化后字节长度:" << bin_data.size() << std::endl; // 3. 反序列化:字节流还原对象 yas::binary_iarchive iar(bin_data); UserInfo dst_user; iar & dst_user; // 4. 校验结果 std::cout << "反序列化结果:" << std::endl; std::cout << "ID:" << dst_user.id << std::endl; std::cout << "名称:" << dst_user.name << std::endl; std::cout << "分数:" << dst_user.score << std::endl; return 0; }示例2:JSON格式序列化
需要跨语言交互、数据可视化场景,可直接切换JSON归档,用法几乎一致。
#include <iostream> #include <string> // 引入JSON序列化头文件 #include "yas/archive/json.hpp" // 复用上面的UserInfo结构体和序列化注册函数 struct UserInfo { int id; std::string name; double score; bool is_valid; }; namespace yas { template<typename Archive> void serialize(Archive &ar, UserInfo &u) { ar & u.id; ar & u.name; ar & u.score; ar & u.is_valid; } } int main() { UserInfo src_user{1002, "CSDN-YAS教程", 99.0, true}; // JSON序列化 yas::json_oarchive oar; oar & src_user; std::string json_str = oar.str(); std::cout << "JSON序列化结果:\n" << json_str << std::endl; // JSON反序列化 yas::json_iarchive iar(json_str); UserInfo dst_user; iar & dst_user; return 0; }示例3:STL容器序列化
YAS原生支持vector、map、string等所有STL容器,无需额外适配:
#include <iostream> #include <vector> #include "yas/archive/binary.hpp" int main() { // STL vector容器序列化 std::vector<int> vec_src = {1,2,3,4,5,6}; yas::binary_oarchive oar; oar & vec_src; yas::binary_iarchive iar(oar.str()); std::vector<int> vec_dst; iar & vec_dst; std::cout << "容器反序列化结果:"; for (auto v : vec_dst) std::cout << v << " "; std::cout << std::endl; return 0; }五、主流序列化库性能&特性对比
帮大家直观理清YAS在主流C++序列化库中的定位,方便技术选型:
序列化库 | 依赖 | 性能 | 上手难度 | 适用场景 |
|---|---|---|---|---|
YAS | Header-Only、零依赖 | 极高 | 极低 | 服务端高性能序列化、嵌入式、存量项目改造 |
Boost.Serialization | 依赖Boost库 | 较低 | 中等 | 老旧项目维护,不推荐新项目使用 |
Protobuf | 依赖编译工具链、库文件 | 高 | 高 | 跨语言通用协议、标准化数据交互 |
FlatBuffers | 依赖编译工具 | 极高 | 高 | 游戏、高性能游戏通信 |
Cereal | Header-Only | 中等 | 低 | 常规轻量化序列化场景 |
结论:如果你的项目追求零依赖、低接入成本、高性能,不需要复杂的协议定义,YAS 是最优选择,完美替代臃肿的Boost序列化方案。
六、YAS适用场景与避坑指南
✅ 推荐使用场景
原有项目使用Boost.Serialization,想要轻量化、性能升级改造
C++服务端高并发网络数据传输、二进制协议封装
嵌入式设备、资源受限场景的数据序列化与持久化
简单跨语言JSON数据交互、本地配置文件存储
❌ 不推荐场景
需要严格标准化、多语言统一的大型协议(优先Protobuf)
极致极致的零拷贝数据读取(优先FlatBuffers)
⚠️ 避坑要点
YAS的JSON格式并非100%完全标准,复杂嵌套JSON场景建议谨慎使用
序列化结构体字段增删后,需重新编译,不兼容旧版本二进制数据(可自行做版本兼容处理)
最低仅支持C++11,超老旧编译器无法适配
七、总结
YAS 作为一款零依赖、Header-Only、高性能的C++序列化开源库,精准解决了传统序列化库的痛点:摒弃了Boost的臃肿,规避了Protobuf的繁琐编译,兼顾了性能与易用性。
对于绝大多数C++开发者的日常开发、服务端开发、嵌入式开发场景,YAS 都是轻量化序列化的最优解之一,接入简单、性能优异、无侵入性,非常值得纳入技术栈。