C++ 序列化反序列化众多方式中的两种

文章介绍了C++中两种序列化方法:一种是使用标准库fstream进行二进制序列化和反序列化,但这种方法仅限于基本类型;另一种是利用Cereal库,它支持多种类型包括STL,并能生成Json等格式。Cereal提供了更强大和灵活的序列化解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++ 序列化反序列化众多方式中的两种(自带、Cereal)

摘要:本文举例说明两种序列化方式,第一种是使用自带的文件操作库ifstream对类进行二进制序列化及反序列化;第二种采用轻量级的Cereal对类进行序列化及反序列化。

一、 两种方式简单对比

  1. 使用fstream的二进制序列化方式只能支持基本类型,对STL等无法操作
  2. Cereal的方式对基本类型和STL等类型都能实现,而且不止能二进制序列化,也能序列化为Json、xml等格式。

二、 Cereal获取

  1. Cereal开源地址
  2. Cereal资源

三、 fstream 方式

请注意,此方式类中全部变量只能是基本类型,否则会出错。

1. 需用添加头文件

#include <fstream>

2. 二进制序列化写入文件
	template<typename T>
    static int WriteBinary(const char *filePath, T &object)
    {
   
   
    	// 创建文件输出流
        std::ofstream ofs;
        // 以输出二进制的方式打开文件,如果文件不存在则新建一个文件
        // 如果文件已经存在则会清空内容
        ofs.open(filePath, std::ios::out | std::ios::binary);
        // 判断文件是否打开成功
        if (!ofs.is_open())
        {
   
   
            std::cout << "open failed" << std::endl;
            return 1;
        }
        // 将对象序列化后写入到文件中并保存
        ofs.write((const char *)&object, sizeof(T));
        // 关闭文件
        ofs.close();
        return 0;
    }
3. 文件读取
    template<typename T>
    static int ReadBinary(const char *filePath, T &object)
    {
   
   
    	// 创建文件输入流
        std::ifstream ifs;
        // 以输入二进制的方式打开文件
        ifs.open(filePath, std::ios::in | std::ios::binary);
        if (!ifs.is_open())
        {
   
   
            std::cout << "open failed" << std::endl;
            return 1;
        }
        ifs.read((char *)&object, sizeof(T));
        ifs.close();
        return 0;
    }

四、 Cereal 方式

本文只介绍二进制和Json方式,其他方式类似,可参考官方文档

在使用此方法之前,需要序列化的类中添加特定的一段代码,如下:

public:
	template<class Archive>
    void serialize(Archive &ar)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值