Unity序列化报错:GameObject未标记可序列化,数据保存代码异常求助
排查与解决:SerializationException 针对 UnityEngine.GameObject 的序列化错误
核心问题分析
你遇到的 SerializationException: Type UnityEngine.GameObject is not marked as Serializable 本质是:Unity的内置Object类型(比如GameObject、Component)无法通过.NET原生的BinaryFormatter进行序列化,哪怕你给包含它的类加了[Serializable]特性也没用。
这些Unity对象是由引擎管理的,它们的内存结构、生命周期和普通.NET对象完全不同,BinaryFormatter无法正确处理它们的序列化逻辑——这和你是否标记类可序列化无关,问题出在字段的类型上。
从你的代码片段推测,你的PlayerData类(或者它嵌套的Stats、equipment集合)里应该直接包含了GameObject类型的字段/元素,这就是报错的根源。
解决方法
要解决这个问题,核心思路是不要直接序列化Unity对象实例,转而序列化对象的「数据表示」,下面是具体可行的方案:
1. 替换为可序列化的数据类型
把PlayerData中的GameObject字段换成普通.NET类型,比如:
- 存储装备的唯一ID(int/string),读取时通过ID从配置表(比如ScriptableObject装备库)中获取对应数据
- 存储资源路径(string),读取时通过
Resources.Load或Addressables加载对应的预制体 - 直接存储装备的属性数值(比如攻击力、防御力),不需要关联GameObject实例
举个修改示例:
// 错误的PlayerData(包含GameObject引用) [Serializable] public class PlayerData { public PlayerStats Stats; public List<GameObject> equipment; // 这里是问题所在 } // 修改后的PlayerData(存储可序列化的数据) [Serializable] public class PlayerData { public PlayerStats Stats; public List<string> equipmentIds; // 存储装备ID,而非GameObject实例 }
然后在读取数据后,根据equipmentIds去你的装备配置系统中查找对应装备,再完成Equipment数组的赋值:
// 假设你有一个装备配置表,通过ID获取装备名称/数据 for (int E = 0; E < Equipment.Length; E++) { Equipment[E] = "NA"; if (E < Player.equipmentIds.Count) { var equipmentData = EquipmentConfig.GetById(Player.equipmentIds[E]); Equipment[E] = equipmentData.Name; // 赋值装备名称而非GameObject } }
2. 使用Unity原生的序列化方案
如果需要更贴合Unity生态的序列化方式,推荐用以下两种:
- ScriptableObject:专门用来存储游戏数据的Unity类,支持可视化编辑和内置序列化,适合存储玩家数据、装备配置等。你可以把
PlayerData改成ScriptableObject子类,直接保存/加载它的实例。 - JsonUtility:Unity自带的JSON序列化工具,只支持标记了
[Serializable]的类,同样需要避免直接序列化Unity Object,只序列化纯数据字段。
3. 替换BinaryFormatter(推荐)
Unity从2021.2版本开始已经标记BinaryFormatter为过时(存在安全漏洞和兼容性问题),建议替换为更安全的序列化库:
- Newtonsoft Json:可以通过Unity Package Manager安装,支持复杂对象的序列化,能灵活处理自定义类型,同样遵循「只序列化数据」的原则即可。
- Protobuf:适合高性能、小体积的数据序列化,尤其适合网络传输或大量数据存储场景。
额外注意事项
- 永远不要尝试序列化Unity的
Object子类(GameObject、MonoBehaviour、Texture等),它们只能通过Unity引擎自身的场景/资源系统管理。 - 如果你的
PlayerStats类里也包含了Unity对象引用,同样需要按照上面的方法替换成纯数据类型。
内容的提问来源于stack exchange,提问作者max anderson
相关产品推荐
相关产品推荐

