# 脚本序列化错误

> Diagnose and fix common script serialization errors in your project.

在某些情况下，脚本序列化可能会导致错误。下面列出了其中一些错误的修复方法。

## 从构造函数或字段初始化函数调用 Unity Scripting API

在 [MonoBehaviour](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md) 构造函数或字段初始化器中调用脚本 API（例如 [GameObject.Find）](/engine/6000.0/script-reference/unity-engine/game-object/find.md)会触发错误：“无法在 MonoBehaviour 构造函数（或实例字段初始化器）中调用 Find，请改为在 Awake 或 Start 中调用。”

解决此问题的方法是在 [MonoBehaviour.Start](/engine/6000.0/script-reference/unity-engine/mono-behaviour/start.md) 中而不是在构造函数中调用脚本 API。

## 在反序列化期间调用 Unity Scripting API

从标记为 `System.Serializable` 的类的构造函数中调用脚本 API（如 [GameObject.Find）](/engine/6000.0/script-reference/unity-engine/game-object/find.md)会触发错误：“无法在序列化过程中调用 Find，请改为在 Awake 或 Start 中调用。”

要解决此问题，请编辑代码，确保不会在任何序列化对象的构造函数中调用任何脚本 API。

## 线程安全的 Unity 脚本 API

大多数脚本 API 都受上面列出的限制所影响。只有部分 Unity Scripting API 免受影响，可从任何位置接受调用。如下：

* [Debug.Log](/engine/6000.0/script-reference/unity-engine/debug/log.md)

* [Mathf](/engine/6000.0/script-reference/unity-engine/mathf.md) 函数

* 简单的独立结构；例如，像 [Vector3](/engine/6000.0/script-reference/unity-engine/vector-3.md) 和 [Quaternion](/engine/6000.0/script-reference/unity-engine/quaternion.md) 这样的数学结构

为了降低序列化过程中出错的风险，只能调用不需要在 Unity 本身中获取或设置数据的独立 API 方法。仅在没有其他选择的情况下才调用它们。

## 其他资源

* [序列化规则](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-serialization/rules.md)
* [Unity 如何使用序列化](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-serialization/how-unity-uses.md)
* [JSONSerialization](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-serialization/json-serialization.md)
* [序列化最佳实践](/engine/6000.0/manual/scripting/compilation-and-code-reload/script-serialization/best-practices.md)
