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

c++ 游戏存档序列化 c++如何设计一个版本兼容的存档系统

大枫酱_8892

大枫酱_8892

发布时间:2026-03-21 20:58:30

|

480人浏览过

|

来源于php中文网

原创

存档结构必须带版本号字段,否则旧存档遇结构微调将解析失败或内存错乱;建议在开头固定写入4字节version,按破坏性变更递增,并显式逐字段序列化、新增字段设默认值且可降级忽略,同时覆盖跨版本读取测试。

c++ 游戏存档序列化 c++如何设计一个版本兼容的存档系统

存档结构必须带版本号字段

不加版本号的存档,等于没留退路。读取时一旦结构微调(比如新增一个 health 成员),旧存档直接解析失败或内存错乱,玩家进度就丢了。

最简方案:在每个存档二进制/文本块开头固定写入 4 字节整数 version,比如 1、2。序列化函数入口先读这个值,再分支处理。

  • 别用宏定义版本常量——改了宏但忘了更新已存档文件,照样崩
  • 版本号建议从 1 开始,每次破坏性变更(字段删/改类型/重命名)才递增,兼容性变更(如新增可选字段)可不升版
  • 如果用 JSON 或 YAML,把 "version": 2 放在根对象第一项,解析时优先检查它

避免直接序列化 class 内存布局

memcpy(&buffer, &obj, sizeof(obj)) 看起来快,实则埋雷:编译器可能加 padding、虚函数表指针位置不固定、成员顺序受 #pragma pack 影响——换编译器或升级 STL 就读不出来。

真正可控的方式是显式逐字段序列化,哪怕多写几行。

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

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 对 std::vector<int>,先写长度 size(),再循环写每个 data[i];别直接写 data() 指针
  • 对 std::string,同样先写长度,再写字符数组;别依赖内部 c_str() 布局
  • 枚举类型统一转成 int 存,防止不同编译器底层用 char 还是 short 不一致

新增字段必须默认可降级忽略

版本 2 存档多了个 last_checkpoint_x,但版本 1 的加载逻辑不能因此崩溃。核心原则:新字段只读不写,旧版本读到不认识的字段就跳过。

具体怎么做取决于格式:

  • 二进制格式:设计字段头(tag-length-value),遇到未知 tag 就按 length 跳过字节
  • JSON 格式:用 json.find("last_checkpoint_x") != json.end() 判断是否存在,不存在就用默认值(如 0.0f)
  • 关键点:所有新增字段必须有合理默认值,且旧逻辑能安全绕过它继续运行

测试必须覆盖跨版本读取路径

光测“本版本存→本版本读”没用。真问题永远出在“v1 存→v2 读”或“v2 存→v1 读(报错提示要友好)”。

  • 手动保留一份 v1 存档文件,每次发版前用新代码加载它,确认不 crash、关键数据(角色血量、位置)正确
  • 写个简单脚本,自动生成 v1/v2/v3 的测试存档,跑自动化校验:字段数量、数值范围、结构完整性
  • 特别注意浮点数精度——float 和 double 混用会导致看似相同的值在跨版本时被误判为变更

版本兼容不是加个字段号就完事,是每次改存档结构时都得问一句:老玩家打开游戏,还能站在他上次退出的地方吗?

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

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

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

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

DeepSeek

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

立刻MV
立刻MV Hot

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

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

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

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

2035

2023.08.07

json是什么
json是什么

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

2942

2023.08.23

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

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

996

2023.10.13

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

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

3319

2025.09.10

string转int
string转int

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

5719

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

5947

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

664

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5904

2023.10.24

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

100

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

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

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