0%

序列化与反序列化:游戏存档背后的魔法

1. 核心概念:存档与读档的艺术

序列化与反序列化是程序设计中实现数据持久化的核心机制,我们可以用 RPG 游戏的“存档”和“读档”来形象理解它们。

1.1 序列化 (Serialization) ~ 存档

序列化是将程序中复杂的内存对象(如自定义模型、类实例、角色状态等)转化为一种可存储或可传输的线性字节流的过程。

  • 目标: 将对象从瞬时的内存状态固化,以便存入文件或进行传输。

1.2 反序列化 (Deserialization) ~ 读档

反序列化是序列化的逆过程,它负责解析存储介质中的字节流,将其重新构建为程序能识别的内存对象,从而完整还原之前的状态。

  • 目标: 通过读取存储数据,重建运行时对象,恢复程序进度。

2. 实战应用:在现有系统上添加新的本地资源

我的需求是为自定义模型类型创建一个新的本地资源类型,目的是将模型的参数、类别等信息持久化到本地文件。由于这是一个本地功能(类似于一个 UE 插件的内部存储),且项目约定使用文本文件(如 JSON) 进行存储,因此我的工作重点是集成和扩展现有资源系统。

2.1 现有序列化系统的运作流程(学习理解)

通过参考同事的指导和已有的项目代码,我理解了一个成熟的资源加载系统通常遵循以下流程:

A. 资源注册与系统启动

  1. 特定目录扫描: 项目启动时,系统会遍历本地资源存储的默认目录。
  2. 资源识别: 系统会读取文件,识别其资源类型唯一标识符(通常是 GUID/UUID)。
  3. 系统注册: 所有资源类型必须预先在系统内完成注册,这是系统识别和处理新资源类型的前提。

B. 反序列化入口与依赖加载

  1. 反序列化入口: 任何需要加载的“场景”或“进度”(如 UE 的 Level 文件或存档文件)都充当反序列化的起始点。
  2. 依赖引用: 这个入口文件并不存储所有资源的完整数据,而是存储了它所依赖的其他资源文件GUID
  3. 级联加载: 反序列化系统会自动读取这些 GUID,并触发相应资源的加载和反序列化,从而实现加载一个文件,还原一个完整对象集合的功能。

2.2 在现有系统中添加新资源类型

我的核心工作是在现有框架下添加支持我自定义模型的数据类型,并实现相应的读写逻辑:

  1. 定义数据结构: 确定我的模型参数信息如何映射到项目约定的文本格式(例如 JSON 结构)。
  2. 实现解析工具:
    • 序列化器 (Serializer): 编写逻辑将内存中的模型对象写入到本地的资源文本文件中。
    • 反序列化器 (Deserializer): 编写逻辑从资源文本文件中读取数据,并将其重建为内存中的模型对象。

我的方法是参考项目中已经存在的资源类型实现,通过“模仿”和“扩展”来确保我的新资源类型能够被系统正确地注册和加载。