# 序列化 API
**本文引用的文件**
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs)
- [README.md(GFramework.Game)](file://GFramework.Game/README.md)
- [README.md(API 参考 - Game)](file://docs/api-reference/game-api.md)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs)
- [GodotFileStorage README](file://GFramework.Godot/storage/README.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [组件详解](#组件详解)
6. [依赖关系分析](#依赖关系分析)
7. [性能与内存优化](#性能与内存优化)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件为 GFramework.Serializer 模块的详细 API 参考文档,聚焦于序列化器接口 ISerializer 与具体实现 JsonSerializer 的能力说明、配置要点、类型处理、错误处理、性能与内存优化建议,以及在设置系统、存储系统、网络通信与缓存系统中的使用范式与最佳实践。文档同时给出与存储系统的集成方式与常见问题排查思路,帮助开发者在游戏开发场景中做出合适的选择与优化。
## 项目结构
围绕序列化能力,相关代码分布在以下位置:
- 抽象接口:GFramework.Game.Abstractions/serializer/ISerializer.cs
- 具体实现:GFramework.Game/serializer/JsonSerializer.cs
- 使用示例与高级特性:GFramework.Game/README.md、docs/api-reference/game-api.md
- 与存储系统的集成:GFramework.Game/storage/FileStorage.cs、GFramework.Godot/storage/README.md
- 设置系统的持久化:GFramework.Game.Abstractions/setting/ISettingsPersistence.cs、GFramework.Game/setting/SettingsPersistence.cs
```mermaid
graph TB
subgraph "抽象层"
A["ISerializer 接口
定义 Serialize/Deserialize"]
end
subgraph "实现层"
B["JsonSerializer 实现
基于 Newtonsoft.Json"]
end
subgraph "应用层"
C["FileStorage 存储实现
使用 ISerializer 进行序列化"]
D["SettingsPersistence 设置持久化
读写设置数据"]
end
subgraph "外部库"
E["Newtonsoft.Json"]
end
A --> B
B --> E
C --> B
D --> C
```
图表来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L234-L258)
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L1-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L39)
章节来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L50-L55)
- [README.md(API 参考 - Game)](file://docs/api-reference/game-api.md#L503-L533)
## 核心组件
- ISerializer 接口:定义泛型 Serialize(T) 与 Deserialize(string) 两个核心方法,作为序列化器的统一契约。
- JsonSerializer 实现:基于 Newtonsoft.Json 提供 JSON 序列化与反序列化能力,并对反序列化失败进行显式错误处理。
章节来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L8-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L9-L29)
## 架构总览
下图展示了序列化器在系统中的角色与调用链路,以及与存储系统的协作方式。
```mermaid
sequenceDiagram
participant Client as "调用方"
participant Ser as "JsonSerializer"
participant Json as "Newtonsoft.Json"
participant Store as "FileStorage"
participant FS as "文件系统"
Client->>Ser : "Serialize(value)"
Ser->>Json : "Serialize(value)"
Json-->>Ser : "JSON 字符串"
Ser-->>Client : "JSON 字符串"
Client->>Ser : "Deserialize(json)"
Ser->>Json : "Deserialize(json)"
Json-->>Ser : "对象实例"
Ser-->>Client : "对象实例"
Client->>Store : "WriteAsync(key, value)"
Store->>Ser : "Serialize(value)"
Ser-->>Store : "JSON 字符串"
Store->>FS : "写入文件"
FS-->>Store : "完成"
Store-->>Client : "完成"
```
图表来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L17-L28)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L240-L255)
## 组件详解
### ISerializer 接口
- 方法
- Serialize(T value): 将任意类型对象序列化为字符串。
- Deserialize(string data): 将字符串反序列化为指定类型对象。
- 设计意图
- 以最小接口暴露序列化能力,便于替换底层实现(如切换到二进制或压缩序列化)。
- 通过泛型约束保证类型安全与易用性。
章节来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L8-L25)
### JsonSerializer 实现
- 能力概览
- 基于 Newtonsoft.Json 的标准序列化与反序列化。
- 对反序列化结果为空的情况抛出异常,明确失败语义。
- 关键行为
- Serialize(T): 直接委托给 JsonConvert.SerializeObject。
- Deserialize(string): 委托 JsonConvert.DeserializeObject,若结果为 null 则抛出异常。
```mermaid
classDiagram
class ISerializer {
+Serialize(value) string
+Deserialize(data) T
}
class JsonSerializer {
+Serialize(value) string
+Deserialize(data) T
}
ISerializer <|.. JsonSerializer : "实现"
```
图表来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L8-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L9-L29)
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L9-L29)
### 类型信息与自定义转换器
- 类型信息处理
- README 中演示了通过 JsonSerializerSettings.TypeNameHandling.Auto 保留类型信息,便于跨语言或跨版本反序列化时恢复精确类型。
- 自定义转换器
- README 展示了针对 Vector2、Color、Godot Resource 的自定义 JsonConverter,覆盖 WriteJson/ReadJson 以满足游戏特定类型序列化需求。
- 版本化序列化
- README 提供了 VersionedData 与 VersionedSerializer 的示例,通过在 JSON 中嵌入版本号与类型名,实现数据迁移与向后兼容。
章节来源
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L652-L703)
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L779-L857)
### 错误处理与健壮性
- 反序列化失败
- JsonSerializer 在反序列化结果为 null 时抛出异常,调用方应捕获并决定回退策略(如使用默认值或重新初始化)。
- 建议
- 在上层封装统一的 DeserializeWithErrorHandling(string) 方法,返回 Result 或 Tuple,避免异常风暴。
- 对于外部输入(网络/文件),先进行格式校验与白名单检查,再进行反序列化。
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L27-L28)
### 与存储系统的集成
- FileStorage 的序列化流程
- WriteAsync(string, T) 中,先通过 ISerializer.Serialize(value) 得到 JSON 字符串,再写入文件。
- 该流程体现了“序列化器”与“存储实现”的解耦:存储实现仅依赖 ISerializer 接口。
- GodotFileStorage 示例
- Godot 存储 README 明确指出需要传入一个序列化器实例(如 JsonSerializer)来构造存储实现,从而实现 JSON 序列化与文件读写。
```mermaid
flowchart TD
Start(["开始"]) --> CheckKey["检查键是否存在"]
CheckKey --> Exists{"存在?"}
Exists --> |是| Read["读取 JSON 字符串"]
Exists --> |否| Default["返回默认值/空对象"]
Read --> Deserialize["调用 JsonSerializer.Deserialize"]
Deserialize --> Result["返回对象实例"]
Default --> Result
```
图表来源
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L240-L255)
- [GodotFileStorage README](file://GFramework.Godot/storage/README.md#L100-L117)
章节来源
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L234-L258)
- [GodotFileStorage README](file://GFramework.Godot/storage/README.md#L63-L133)
### 设置系统的数据持久化
- ISettingsPersistence 与 SettingsPersistence
- 通过异步 LoadAsync/SaveAsync 等方法,结合存储系统实现设置数据的加载与保存。
- 在加载成功后发送事件(如 SettingsLoadedEvent),便于订阅者响应数据变更。
- 与序列化器的关系
- SettingsPersistence 依赖 IStorage,IStorage 内部使用 ISerializer 进行序列化,因此设置数据的持久化天然受益于序列化器的类型安全与错误处理。
章节来源
- [ISettingsPersistence.cs](file://GFramework.Game.Abstractions/setting/ISettingsPersistence.cs#L12-L43)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L12-L39)
### 网络通信与缓存系统的使用场景
- 网络通信
- 将对象序列化为 JSON 字符串后通过网络发送;接收端反序列化为对象。建议在网络层增加压缩(见性能章节)与版本控制(见版本化序列化示例)。
- 缓存系统
- 将对象序列化为 JSON 字节流存入缓存(如内存缓存或分布式缓存),读取时反序列化。可结合缓存层(如 CachedStorage)提升命中率与性能。
章节来源
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L550-L647)
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L1226-L1274)
## 依赖关系分析
- JsonSerializer 依赖 Newtonsoft.Json 进行序列化与反序列化。
- FileStorage 依赖 ISerializer 进行对象到字符串的转换,再写入文件系统。
- SettingsPersistence 依赖 IStorage,间接依赖 ISerializer。
- GodotFileStorage README 明确要求传入序列化器实例以构造存储实现。
```mermaid
graph LR
ISer["ISerializer 接口"] --> JSer["JsonSerializer 实现"]
JSer --> NJ["Newtonsoft.Json"]
FStore["FileStorage"] --> ISer
SP["SettingsPersistence"] --> FStore
GFS["GodotFileStorage README"] --> JSer
```
图表来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L2)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L240-L255)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L14-L35)
- [GodotFileStorage README](file://GFramework.Godot/storage/README.md#L100-L117)
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L2)
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L1379-L1398)
## 性能与内存优化
- 格式选择
- JSON:可读性好,适合调试与配置;二进制(如 MessagePack)体积更小、解析更快;压缩可进一步降低体积但增加 CPU 开销。
- 压缩与异步
- 对大对象或频繁写入场景,可采用压缩序列化;对高频读写场景优先考虑异步 API,避免阻塞主线程。
- 自定义序列化逻辑
- 使用 [JsonIgnore]/[JsonProperty] 控制字段;通过 ShouldSerializeXxx 条件序列化;使用 [OnDeserialized] 初始化默认值。
- 版本控制与迁移
- 在 JSON 中嵌入版本号与类型名,实现平滑迁移,避免因字段变更导致的反序列化失败。
- 缓存与批量操作
- 结合缓存层(如 CachedStorage)减少重复序列化与 IO;对批量写入使用异步并行,提升吞吐量。
章节来源
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L1226-L1274)
- [README.md(GFramework.Game)](file://GFramework.Game/README.md#L550-L647)
- [README.md(API 参考 - Game)](file://docs/api-reference/game-api.md#L515-L533)
## 故障排查指南
- 反序列化失败
- 现象:Deserialize 返回 null 并抛出异常。
- 排查:确认 JSON 格式正确、字段名匹配、类型信息完整(必要时启用 TypeNameHandling.Auto)、无循环引用导致栈溢出。
- 类型不匹配
- 现象:反序列化为基类或未知类型。
- 排查:确保 JSON 中包含类型信息(TypeNameHandling.Auto),或在上层显式指定目标类型。
- 性能瓶颈
- 现象:序列化/反序列化耗时长。
- 排查:评估是否需要压缩、是否可改用二进制格式、是否可引入缓存、是否可批量异步处理。
- 存储写入失败
- 现象:WriteAsync 失败或锁冲突。
- 排查:检查文件路径权限、并发写入策略、锁粒度与顺序,避免死锁。
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L27-L28)
- [FileStorage.cs](file://GFramework.Game/storage/FileStorage.cs#L240-L255)
## 结论
GFramework.Serializer 通过 ISerializer 抽象与 JsonSerializer 实现,为游戏开发提供了简洁、类型安全且易于扩展的序列化能力。结合存储系统与设置系统,可在数据持久化、网络传输与缓存场景中高效工作。通过合理选择序列化格式、引入压缩与版本控制、使用自定义转换器与缓存策略,开发者可以在可维护性与性能之间取得良好平衡。
## 附录
- 常用 API 速查
- ISerializer.Serialize(T)
- ISerializer.Deserialize(string)
- JsonSerializer(可选传入 JsonSerializerSettings)
- FileStorage.WriteAsync(string, T)
- SettingsPersistence.LoadAsync() / SaveAsync(T)
- 最佳实践清单
- 为外部输入增加校验与白名单。
- 对大对象启用压缩或二进制格式。
- 使用自定义转换器处理游戏特有类型。
- 通过版本化序列化保障向后兼容。
- 使用缓存与批量异步提升性能。