讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么将对象持久化到本地文件_简单的对象序列化方案【详解】

冬辰姑娘_1003

冬辰姑娘_1003

发布时间:2026-03-25 19:03:21

|

245人浏览过

|

来源于php中文网

原创

行,但仅适用于POD类型;boost::serialization需手动实现serialize()且不跨平台;nlohmann::json需定义to_json/from_json;跨进程必须用带版本的标准化格式。

c++怎么将对象持久化到本地文件_简单的对象序列化方案【详解】

用 std::ofstream 直接写二进制结构体,行不行?

行,但只适用于最简单的 POD 类型(比如纯 int、double、固定长度数组),且必须确保对象内存布局稳定。一旦类里有 std::string、std::vector、虚函数、继承或对齐变化,直接 write() 就会写入指针地址或无效内存,反序列化时必然崩溃或数据错乱。

常见错误现象:std::ifstream::read() 读出来全是乱码或程序直接 segfault;调试发现 std::string 的内部指针指向非法地址。

  • 检查类型是否为 POD:用 std::is_pod_v<t></t>(C++17 起)或 std::is_trivially_copyable_v<t></t>(更准确)
  • 禁用编译器重排:加 #pragma pack(1) 或用 [[gnu::packed]](仅当真需要紧凑布局时)
  • 写前确认 sizeof(T) 和字段偏移量没被优化干扰(offsetof(T, field) 可验证)

用 boost::serialization 做通用序列化,要注意什么?

它能自动处理 std::string、容器、多态、指针共享等复杂情况,但代价是侵入式——你得为每个要序列化的类专门写 serialize() 成员函数,而且必须链接 Boost 库(静态或动态)。

使用场景:已有较成熟 C++ 项目,不介意引入外部依赖,且对象结构常变、含 STL 容器或继承关系。

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

  • 必须在头文件中包含 <boost></boost> 等对应头
  • 类需声明 friend class boost::serialization::access; 并定义 serialize() 函数
  • 二进制存档不跨平台、不跨 Boost 版本兼容:同一份文件在不同机器或 Boost 1.75/1.82 下可能无法读取
  • 性能上比裸 memcpy 慢 3–10 倍,尤其含大量小对象时(因元信息开销和运行时类型检查)

手写文本序列化(JSON / INI)时,nlohmann::json 怎么对接自定义类?

适合调试友好、需人工查看或跨语言交互的场景。nlohmann/json 支持 ADL-based 自定义序列化,无需修改库代码,但必须显式定义 to_json() 和 from_json() 两个非成员函数。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

容易踩的坑:字段名拼错、类型转换隐式失败(比如把 int 写成 double 字段再读)、缺失 const 引用导致临时对象绑定失败。

  • to_json() 第一个参数必须是 json&,第二个是 const T&
  • from_json() 第一个参数是 const json&,第二个是 T&
  • 字段名务必与 JSON 中完全一致(区分大小写),建议用字符串字面量避免拼写错误
  • 读取时用 j.at("field").get<int>()</int> 而非 j["field"].get<int>()</int>,前者抛异常提示缺失字段

示例片段:

void to_json(nlohmann::json& j, const Person& p) {
    j = nlohmann::json{{"name", p.name}, {"age", p.age}};
}
void from_json(const nlohmann::json& j, Person& p) {
    p.name = j.at("name").get<std::string>();
    p.age = j.at("age").get<int>();
}

跨进程或长期存储时,为什么不能只靠 reinterpret_cast<char></char>?

因为 C++ 对象的内存表示不是契约性的。哪怕同一个编译器,开启 -O2 后字段重排、添加填充字节、启用 __attribute__((ms_abi)) 都可能改变布局;不同平台的字节序、指针宽度、浮点格式更没法统一。所谓“简单序列化”,一旦脱离单次运行、同编译配置、同架构环境,就不可靠。

真正需要持久化的场景(如配置保存、存档、网络传输),必须选有明确定义格式的方案:协议缓冲区(Protobuf)、FlatBuffers、Cap’n Proto,或者至少用带版本号的自定义二进制头 + 字段校验。

  • 哪怕只加一行版本号字段(如 uint32_t version = 1;),也能在读取时快速拒绝不兼容格式
  • 所有浮点数建议转成 IEEE 754 标准整数再存(memcpy(&i, &f, sizeof(f))),避免平台差异
  • 字符串统一用 UTF-8 编码 + 显式长度前缀(而非依赖 '\0'),否则遇到嵌入空字符就截断

事情说清了就结束。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

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

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

2195

2023.08.07

json是什么
json是什么

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

3482

2023.08.23

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

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

1176

2023.10.13

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

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

4019

2025.09.10

string转int
string转int

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

6839

2023.08.02

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

355

2025.11.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2298

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1818

2023.08.03

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn