GeWuYou a79f02c987 docs(api): 添加 Core API 参考文档与事件系统接口文档
- 新增 Core API 参考文档,涵盖架构与模块、数据模型与系统、命令与查询等核心组件
- 添加事件系统接口详细文档,包括 IEvent、IEventBus、IUnRegister 等接口说明
- 提供完整的 API 使用示例路径、最佳实践与性能建议
- 包含架构图、依赖关系图与故障排查指南
- 添加测试用例参考与扩展方法说明
- [skip ci]
2026-01-21 23:45:10 +08:00

303 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 序列化器
<cite>
**本文引用的文件**
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs)
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs)
- [README.mdGFramework.Game](file://GFramework.Game/README.md)
- [game-api.mddocs](file://docs/api-reference/game-api.md)
- [architecture-patterns.mddocs](file://docs/best-practices/architecture-patterns.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [组件详解](#组件详解)
6. [依赖关系分析](#依赖关系分析)
7. [性能与优化](#性能与优化)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向GFramework的序列化子系统聚焦于JsonSerializer的JSON序列化实现系统性阐述ISerializer接口的设计理念、类型处理机制、在游戏开发中的典型应用场景数据持久化、网络传输、配置管理以及性能优化策略缓存、延迟加载、内存管理。同时提供配置选项、API参考与实践示例并总结最佳实践、错误处理与兼容性注意事项。
## 项目结构
围绕序列化能力,相关代码主要分布在以下模块:
- 抽象层ISerializer接口定义
- 实现层JsonSerializer基于Newtonsoft.Json的具体实现
- 应用层:设置系统与持久化服务,展示序列化在“配置管理”场景中的使用
- 文档与示例README与API文档中给出的使用示例、自定义转换器与版本化序列化方案
```mermaid
graph TB
subgraph "抽象层"
IS["ISerializer 接口"]
end
subgraph "实现层"
JS["JsonSerializer 实现<br/>基于 Newtonsoft.Json"]
end
subgraph "应用层"
SS["SettingsSystem<br/>应用设置"]
SP["SettingsPersistence<br/>加载/保存设置"]
SM["SettingsModel<br/>数据与应用器注册"]
end
subgraph "文档与示例"
DOC["GFramework.Game/README.md<br/>使用示例/自定义转换器/版本化"]
API["docs/api-reference/game-api.md<br/>API参考"]
BP["docs/best-practices/architecture-patterns.md<br/>错误处理/最佳实践"]
end
IS --> JS
SS --> SM
SP --> SM
SS --> JS
SP --> JS
DOC --> JS
API --> JS
BP --> SS
```
图表来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L649-L1274)
- [game-api.mddocs](file://docs/api-reference/game-api.md#L535-L601)
- [architecture-patterns.mddocs](file://docs/best-practices/architecture-patterns.md#L833-L1036)
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L649-L1274)
## 核心组件
- ISerializer接口定义统一的序列化与反序列化抽象面向字符串格式的通用契约便于替换不同实现如JSON、MessagePack等
- JsonSerializer实现封装Newtonsoft.Json提供类型安全的Serialize/Deserialize方法在反序列化失败时抛出异常以明确失败原因。
- 设置系统与持久化通过SettingsSystem/SettingsPersistence/SettingsModel展示序列化在“配置管理”中的典型流程加载、应用、保存、批量处理与事件通知。
章节来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
## 架构总览
下图展示了序列化器在“设置系统”中的角色与交互路径:设置模型提供数据与应用器,持久化服务负责读写存储,系统负责应用设置并发出事件,序列化器贯穿其中用于数据的序列化与反序列化。
```mermaid
sequenceDiagram
participant Ctx as "上下文/系统"
participant Model as "SettingsModel"
participant Persist as "SettingsPersistence"
participant Storage as "IStorage"
participant Ser as "JsonSerializer"
participant Sys as "SettingsSystem"
Ctx->>Persist : LoadAsync<T>()
Persist->>Storage : ExistsAsync(key)
alt 存在
Persist->>Storage : ReadAsync<T>(key)
Storage-->>Persist : T 实例
Persist-->>Ctx : T 实例
else 不存在
Ctx->>Model : GetData<T>()
Model-->>Ctx : 新建 T 实例
end
Ctx->>Sys : ApplyAll()/Apply<T>()
Sys->>Model : TryGet(type, out section)
Sys->>Ser : Deserialize<T>(json) 或直接使用实例
Sys-->>Ctx : 发送 SettingsAppliedEvent
Ctx->>Persist : SaveAsync<T>(section)
Persist->>Ser : Serialize<T>(section)
Persist->>Storage : WriteAsync(key, section)
Persist-->>Ctx : 发送 SettingsSavedEvent
```
图表来源
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
## 组件详解
### ISerializer接口设计
- 设计目标提供统一的序列化抽象屏蔽具体实现细节便于扩展多种格式JSON、MessagePack、Protocol Buffers等
- 关键点:
- 泛型方法Serialize<T>/Deserialize<T>确保类型安全。
- 作为IUtility的子接口融入GFramework的工具体系。
- 与存储系统、设置系统解耦,便于替换实现。
章节来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
### JsonSerializer实现
- 功能要点:
- Serialize<T>将任意对象序列化为JSON字符串。
- Deserialize<T>将JSON字符串反序列化为指定类型对象若解析失败返回空值则抛出异常明确失败语义。
- 与Newtonsoft.Json的关系直接委托其SerializeObject/DeserializeObject保持与该生态一致的特性与行为。
- 类型处理机制:
- 支持Newtonsoft.Json的特性如自定义转换器、忽略/包含属性、类型名处理等)。
- 通过Converters集合扩展对特定类型如Vector2、Color、Godot Resource的序列化支持。
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L649-L777)
### 设置系统中的序列化应用
- SettingsModel维护两类设置集合数据设置与应用器设置提供GetData/RegisterApplicator/TryGet/All等方法支撑设置系统的统一管理。
- SettingsPersistence负责设置的加载、保存、删除、批量处理与存在性检查内部通过IStorage进行读写并在关键节点发送事件。
- SettingsSystem负责应用设置TryApply在应用前后发送事件捕获异常并向上抛出保证错误可见性与可恢复性。
章节来源
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
### API参考与使用示例
- 基础API
- Serialize<T>(T value)序列化为JSON字符串。
- Deserialize<T>(string data)从JSON字符串反序列化为T。
- 使用示例与扩展
- README中提供了自定义转换器Vector2/Color/Godot Resource与版本化序列化VersionedData+迁移)的完整示例。
- API参考文档给出了Serialize/Deserialize/File/Async/Compressed等常见用法的片段。
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L649-L868)
- [game-api.mddocs](file://docs/api-reference/game-api.md#L535-L601)
### 类图(接口与实现)
```mermaid
classDiagram
class ISerializer {
+Serialize<T>(value) string
+Deserialize<T>(data) T
}
class JsonSerializer {
+Serialize<T>(value) string
+Deserialize<T>(data) T
}
class SettingsSystem {
-ISettingsModel _model
+ApplyAll() Task
+Apply<T>() Task
+Apply(Type) Task
+Apply(IEnumerable<Type>) Task
}
class SettingsPersistence {
-IStorage _storage
+LoadAsync<T>() Task<T>
+SaveAsync<T>(section) Task
+ExistsAsync<T>() Task<bool>
+DeleteAsync<T>() Task
+SaveAllAsync(allData) Task
+LoadAllAsync(knownTypes) Task<IDictionary<Type,ISettingsData>>
}
class SettingsModel {
-Dictionary<Type, IApplyAbleSettings> _applicators
-Dictionary<Type, ISettingsData> _dataSettings
+GetData<T>() T
+RegisterApplicator<T>(applicator) ISettingsModel
+GetApplicator<T>() T?
+TryGet(type, out section) bool
+All() IEnumerable<ISettingsSection>
}
ISerializer <|.. JsonSerializer
SettingsSystem --> SettingsModel : "使用"
SettingsPersistence --> SettingsModel : "读取/写入"
SettingsSystem --> JsonSerializer : "可能参与序列化"
SettingsPersistence --> JsonSerializer : "可能参与序列化"
```
图表来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
## 依赖关系分析
- 耦合与内聚
- ISerializer与JsonSerializer之间为接口与实现的清晰分离内聚度高、耦合度低。
- SettingsSystem/SettingsPersistence/SettingsModel形成稳定的协作关系序列化器作为可选组件被间接使用。
- 外部依赖
- JsonSerializer依赖Newtonsoft.Json通过Converters扩展实现自定义类型序列化。
- 循环依赖
- 当前结构未见循环依赖迹象,各模块职责边界清晰。
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
## 性能与优化
- 缓存机制
- 存储层提供缓存包装CachedStorage可显著降低频繁读取带来的IO开销序列化器本身未内置缓存但可在上层结合缓存策略使用。
- 延迟加载与懒初始化
- SettingsModel的GetData<T>()采用“首次缺失创建”的策略,避免不必要的实例化。
- 内存管理
- 使用Converters扩展自定义类型序列化减少中间对象的创建与拷贝。
- 对大对象或高频序列化场景建议结合压缩README中给出压缩思路与批量写入SettingsPersistence的SaveAllAsync
- 版本化与兼容性
- README中提供版本化序列化与迁移方案避免因字段变更导致的反序列化失败。
章节来源
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L550-L647)
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L649-L868)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L76-L87)
## 故障排查指南
- 反序列化失败
- JsonSerializer在反序列化返回空值时会抛出异常提示“无法反序列化数据”。应检查JSON格式、类型匹配与转换器配置。
- 设置应用异常
- SettingsSystem在应用设置时捕获异常并发送事件同时向上抛出便于定位问题。建议在业务层捕获并记录上下文信息。
- 错误恢复策略
- 参考最佳实践文档中的错误处理与恢复策略,优先尝试从备份存储恢复,最后回退到默认数据,确保系统可用性。
章节来源
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L25-L29)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L83-L98)
- [architecture-patterns.mddocs](file://docs/best-practices/architecture-patterns.md#L833-L1036)
## 结论
GFramework的序列化子系统以ISerializer为抽象核心JsonSerializer提供简洁可靠的JSON实现并通过Converters扩展满足游戏开发中的复杂类型需求。在“设置系统”中序列化器与设置模型、持久化服务、系统协作良好覆盖了配置管理的全生命周期。结合缓存、延迟加载、版本化与错误恢复策略可在保证易用性的同时兼顾性能与稳定性。
## 附录
### 配置选项与扩展点
- Newtonsoft.Json设置
- README示例展示了如何配置Formatting、NullValueHandling、DefaultValueHandling与TypeNameHandling等。
- 自定义转换器
- README提供了Vector2/Color/Godot Resource的转换器示例可直接扩展到更多类型。
- 版本化与迁移
- README提供了VersionedData与迁移接口的实现思路便于跨版本兼容。
章节来源
- [README.mdGFramework.Game](file://GFramework.Game/README.md#L649-L868)
### API参考摘要
- ISerializer
- Serialize<T>(T value):序列化为字符串
- Deserialize<T>(string data)反序列化为T
- JsonSerializer
- 基于Newtonsoft.Json的实现支持Converters扩展
- SettingsSystem/SettingsPersistence/SettingsModel
- 提供设置的加载、应用、保存、批量处理与事件通知
章节来源
- [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25)
- [JsonSerializer.cs](file://GFramework.Game/serializer/JsonSerializer.cs#L1-L29)
- [SettingsSystem.cs](file://GFramework.Game/setting/SettingsSystem.cs#L1-L99)
- [SettingsPersistence.cs](file://GFramework.Game/setting/SettingsPersistence.cs#L1-L141)
- [SettingsModel.cs](file://GFramework.Game/setting/SettingsModel.cs#L1-L103)
- [game-api.mddocs](file://docs/api-reference/game-api.md#L535-L601)