You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:46:52