# 序列化器 **本文引用的文件** - [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) ## 目录 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 实现
基于 Newtonsoft.Json"] end subgraph "应用层" SS["SettingsSystem
应用设置"] SP["SettingsPersistence
加载/保存设置"] SM["SettingsModel
数据与应用器注册"] end subgraph "文档与示例" DOC["GFramework.Game/README.md
使用示例/自定义转换器/版本化"] API["docs/api-reference/game-api.md
API参考"] BP["docs/best-practices/architecture-patterns.md
错误处理/最佳实践"] 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() Persist->>Storage : ExistsAsync(key) alt 存在 Persist->>Storage : ReadAsync(key) Storage-->>Persist : T 实例 Persist-->>Ctx : T 实例 else 不存在 Ctx->>Model : GetData() Model-->>Ctx : 新建 T 实例 end Ctx->>Sys : ApplyAll()/Apply() Sys->>Model : TryGet(type, out section) Sys->>Ser : Deserialize(json) 或直接使用实例 Sys-->>Ctx : 发送 SettingsAppliedEvent Ctx->>Persist : SaveAsync(section) Persist->>Ser : Serialize(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/Deserialize确保类型安全。 - 作为IUtility的子接口,融入GFramework的工具体系。 - 与存储系统、设置系统解耦,便于替换实现。 章节来源 - [ISerializer.cs](file://GFramework.Game.Abstractions/serializer/ISerializer.cs#L1-L25) ### JsonSerializer实现 - 功能要点: - Serialize:将任意对象序列化为JSON字符串。 - Deserialize:将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 value):序列化为JSON字符串。 - Deserialize(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(value) string +Deserialize(data) T } class JsonSerializer { +Serialize(value) string +Deserialize(data) T } class SettingsSystem { -ISettingsModel _model +ApplyAll() Task +Apply() Task +Apply(Type) Task +Apply(IEnumerable) Task } class SettingsPersistence { -IStorage _storage +LoadAsync() Task +SaveAsync(section) Task +ExistsAsync() Task +DeleteAsync() Task +SaveAllAsync(allData) Task +LoadAllAsync(knownTypes) Task> } class SettingsModel { -Dictionary _applicators -Dictionary _dataSettings +GetData() T +RegisterApplicator(applicator) ISettingsModel +GetApplicator() T? +TryGet(type, out section) bool +All() IEnumerable } 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()采用“首次缺失创建”的策略,避免不必要的实例化。 - 内存管理 - 使用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 value):序列化为字符串 - Deserialize(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)