# 序列化器

<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.md（GFramework.Game）](file://GFramework.Game/README.md)
- [game-api.md（docs）](file://docs/api-reference/game-api.md)
- [architecture-patterns.md（docs）](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.md（GFramework.Game）](file://GFramework.Game/README.md#L649-L1274)
- [game-api.md（docs）](file://docs/api-reference/game-api.md#L535-L601)
- [architecture-patterns.md（docs）](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.md（GFramework.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.md（GFramework.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.md（GFramework.Game）](file://GFramework.Game/README.md#L649-L868)
- [game-api.md（docs）](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.md（GFramework.Game）](file://GFramework.Game/README.md#L550-L647)
- [README.md（GFramework.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.md（docs）](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.md（GFramework.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.md（docs）](file://docs/api-reference/game-api.md#L535-L601)