Version: 6000.3
语言: 中文
JSON 序列化
集成第三方代码库(插件)

序列化最佳做法

应用以下编码实践和组织原则来防止错误并优化项目中的序列化性能。

线程安全

大多数 Unity API 只能从主线程调用。不要从可序列化类型的构造函数和字段初始值设定项调用 Unity API,因为它们在单独的加载线程上运行。

开发版本开发版本包括调试符号并启用性能分析器。更多信息
请参阅术语表
,如果您尝试从加载线程调用主线程 API,Unity 会抛出错误。在发布版本中,代码运行时没有错误,但可能会在应用程序中产生崩溃和其他意外行为。

提示:为了降低序列化过程中出错的风险,请勿调用可能影响项目状态或涉及其他 Unity 对象的 API 方法。可以安全调用的 API 包括Debug.Log以及那些处理简单数据类型的数据,例如数学函数Vector3.

终结者

不要从终结器方法启动序列化。终结器不在主线程上运行。垃圾回收器确定它们何时运行,在某些情况下,它们可能根本不运行。

尝试序列化终结器中的数据可能会导致意外行为和崩溃。有关详细信息,请参阅有关终结器的 Microsoft 文档。

组织数据

您可以按如下方式组织数据,以确保最佳地使用 Unity 的序列化:

  • 目标是让 Unity 序列化尽可能小的数据集。这样做的目的不是为了节省计算机硬盘上的空间,而是为了确保您可以保持与以前版本的项目的向后兼容性。如果使用大量序列化数据集,则在开发后期的向后兼容性可能会变得更加困难。
  • 切勿让 Unity 序列化重复数据或缓存数据。这会导致向后兼容性出现重大问题:由于数据可能不同步,因此出错风险很高。
  • 添加引用自定义 C# 类或结构的字段时要小心。在字段中引用自定义 C# 类或结构时,Unity 会将引用对象的全部内容嵌入到引用对象的序列化数据中。如果此结构变得复杂或深度嵌套,则将来更改结构时可能很难迁移此数据。此外,来自对象的数据很容易在序列化数据中无意中重复多次。相反,旨在保持 MonoBehaviour 和 ScriptableObject 派生类中的结构平坦和简单。
  • 在对象之间共享数据的方法是使用 ScriptableObjects。当您引用派生自UnityEngine.Object(例如派生自 ScriptableObject 的类),Unity 仅序列化引用,而不是整个对象图。因此,数据在 ScriptableObject 中仅序列化一次,而不是在引用它的每个点上。同样,您可以使用[SerializeReference]属性,如果要在单个 MonoBehaviour 或 ScriptableObject 中多次引用相同的自定义 C# 类。有关详细信息,请参阅自定义类的序列化

其他资源

JSON 序列化
集成第三方代码库(插件)