0

0

C++如何实现类的序列化与反序列化

P粉602998670

P粉602998670

发布时间:2025-09-07 11:16:02

|

254人浏览过

|

来源于php中文网

原创

C++类的序列化需手动实现或借助第三方库。1. 手动实现通过重载读写函数将成员变量存入流;2. Boost.Serialization支持多种格式和复杂类型,使用归档机制自动处理;3. JSON库如nlohmann/json适用于可读和跨平台场景,通过to_json/from_json转换;4. 注意访问权限、指针处理、字节序及版本兼容性,根据需求选择合适方案。

c++如何实现类的序列化与反序列化

在C++中,标准库并没有直接提供类的序列化与反序列化机制,不像Java或C#那样内置支持。因此,要实现C++类的序列化(将对象保存为字节流或文本)和反序列化(从字节流或文本恢复对象),需要手动实现或借助第三方库。以下是几种常见且实用的方法。

1. 手动实现序列化与反序列化

最基础的方式是通过重载输入输出操作符或自定义读写函数,将对象的成员变量逐个写入文件或内存缓冲区。

// 示例:简单Person类的手动序列化

class Person {
private:
    std::string name;
    int age;

public:
    Person() = default;
    Person(const std::string& n, int a) : name(n), age(a) {}

    // 序列化:将对象写入输出流
    void serialize(std::ostream& out) const {
        size_t nameLen = name.size();
        out.write(reinterpret_cast(&nameLen), sizeof(nameLen));
        out.write(name.data(), nameLen);
        out.write(reinterpret_cast(&age), sizeof(age));
    }

    // 反序列化:从输入流恢复对象
    void deserialize(std::istream& in) {
        size_t nameLen;
        in.read(reinterpret_cast(&nameLen), sizeof(nameLen));
        name.resize(nameLen);
        in.read(&name[0], nameLen);
        in.read(reinterpret_cast(&age), sizeof(age));
    }
};

使用示例:

std::ofstream out("data.bin", std::ios::binary);
Person p("Alice", 30);
p.serialize(out);
out.close();

std::ifstream in("data.bin", std::ios::binary);
Person p2;
p2.deserialize(in);
in.close();

2. 使用Boost.Serialization库(推荐)

Boost提供了功能强大且类型安全的序列化库,支持文本、二进制、XML等多种格式,并能自动处理复杂对象关系(如指针、STL容器等)。

立即学习C++免费学习笔记(深入)”;

// 需包含头文件并链接Boost.Serialization

#include
#include
#include
#include

class Person {
private:
    std::string name;
    int age;

    // 序列化访问声明
    friend class boost::serialization::access;

    template
    void serialize(Archive& ar, const unsigned int version) {
        ar & name;
        ar & age;
    }

public:
    Person() {}
    Person(const std::string& n, int a) : name(n), age(a) {}
};

使用示例(文本归档):

std::ofstream ofs("person.txt");
boost::archive::text_oarchive oa(ofs);
Person p("Bob", 25);
oa ofs.close();

反序列化:

std::ifstream ifs("person.txt");
boost::archive::text_iarchive ia(ifs);
Person p2;
ia >> p2;
ifs.close();

3. 使用JSON库(如nlohmann/json)

对于需要可读性和跨平台交互的场景,JSON是很好的选择。nlohmann的JSON库支持C++类的序列化。

站长俱乐部购物系统
站长俱乐部购物系统

功能介绍:1、模块化的程序设计,使得前台页面设计与程序设计几乎完全分离。在前台页面采用过程调用方法。在修改页面设计时只需要在相应位置调用设计好的过程就可以了。另外,这些过程还提供了不同的调用参数,以实现不同的效果;2、阅读等级功能,可以加密产品,进行收费管理;3、可以完全可视化编辑文章内容,所见即所得;4、无组件上传文件,服务器无需安装任何上传组件,无需支持FSO,即可上传文件。可限制文件上传的类

下载

定义转换函数:

using json = nlohmann::json;

void to_json(json& j, const Person& p) {
    j = json{{"name", p.name}, {"age", p.age}};
}

void from_json(const json& j, Person& p) {
    j.at("name").get_to(p.name);
    j.at("age").get_to(p.age);
}

使用:

Person p = {"Charlie", 35};
json j = p; // 自动调用to_json
std::string s = j.dump(); // 转为字符串

Person p2 = s; // 或:from_json(json::parse(s), p2);

4. 注意事项与建议

序列化时需注意以下几点:

  • 确保成员变量的访问权限允许序列化函数读取(可通过友元或公有接口)
  • 处理指针时要小心,避免浅拷贝问题
  • 二进制序列化注意字节序和对齐问题,跨平台需谨慎
  • 包含STL容器(如vector、string)时,Boost或JSON方式更安全
  • 版本兼容性:若类结构可能变化,应设计版本控制机制

基本上就这些。手动实现适合简单场景,Boost功能全面但引入依赖,JSON适合配置或网络传输。选择哪种方式取决于项目需求和环境限制。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1900

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2091

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1063

2024.11.28

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

157

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 7.8万人学习

Java 教程
Java 教程

共578课时 | 52.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号