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

Unity3D中自定义类列表转JSON文件时出现序列化错误

Unity自定义List序列化JSON报错的解决方法

我定义了如下自定义类用于存储游戏对象数据:

[Serializable]
public class Mycustom_gameobject_list
{
    public WayspotAnchorPayload game_object_coordinates;
    public GameObject storing_gameobject;
}

[Serializable]
public class Gameobject_lsit : MonoBehaviour
{
    public List<Mycustom_gameobject_list> Store_gameobjects_list = new List<Mycustom_gameobject_list>();
}

将数据存入上述List后,尝试用以下代码序列化JSON时出现错误:

public static void SaveLocalPayloads(List<Mycustom_gameobject_list> savelist)
{
    Debug.Log(savelist.Count);
    convertData = JsonConvert.SerializeObject(savelist);
    Debug.Log(convertData);
}

报错原因

  1. GameObject无法直接序列化:GameObject是Unity内置核心类型,包含大量内部引用、未序列化字段,Json.NET无法处理这类复杂对象,会触发循环引用或访问权限错误。
  2. WayspotAnchorPayload序列化问题:如果该类型是AR SDK(如AR Foundation)的内置类型,未标记[Serializable]或无公开可序列化字段,Json.NET也无法解析。

解决方法

方法1:只序列化必要数据(推荐)

避免直接存储GameObject,转而序列化其关键属性(位置、旋转、预制体标识等),后续通过这些数据重建对象:

[Serializable]
public class Mycustom_gameobject_list
{
    public WayspotAnchorPayload game_object_coordinates;
    // 存储GameObject的核心可序列化数据
    public Vector3 objectPosition;
    public Quaternion objectRotation;
    public Vector3 objectScale;
    // 用于重建对象的标识(如预制体路径)
    public string prefabResourcePath;
}

方法2:为Unity类型添加自定义Json转换器

如果必须序列化GameObject或WayspotAnchorPayload,可以编写自定义JsonConverter来控制序列化逻辑:

// GameObject自定义转换器示例
public class GameObjectConverter : JsonConverter<GameObject>
{
    public override GameObject ReadJson(JsonReader reader, Type objectType, GameObject existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 反序列化:从JSON数据重建GameObject
        var jsonObj = JObject.Load(reader);
        var prefabPath = jsonObj["PrefabPath"].Value<string>();
        var pos = jsonObj["Position"].ToObject<Vector3>();
        var rot = jsonObj["Rotation"].ToObject<Quaternion>();

        var prefab = Resources.Load<GameObject>(prefabPath);
        return Object.Instantiate(prefab, pos, rot);
    }

    public override void WriteJson(JsonWriter writer, GameObject value, JsonSerializer serializer)
    {
        // 序列化:只写入需要保存的字段
        var jsonObj = new JObject();
        jsonObj.Add("PrefabPath", "Prefabs/YourTargetPrefab"); // 替换为实际预制体路径逻辑
        jsonObj.Add("Position", JToken.FromObject(value.transform.position, serializer));
        jsonObj.Add("Rotation", JToken.FromObject(value.transform.rotation, serializer));

        jsonObj.WriteTo(writer);
    }
}

使用转换器序列化:

var serializeSettings = new JsonSerializerSettings();
serializeSettings.Converters.Add(new GameObjectConverter());
// 若WayspotAnchorPayload也需要转换,添加对应转换器
convertData = JsonConvert.SerializeObject(savelist, serializeSettings);

方法3:改用Unity内置JsonUtility

Unity原生的JsonUtility对内置类型支持更友好,适合简单序列化场景(需确保所有自定义类型标记[Serializable]):

// 先将List包装在可序列化类中(JsonUtility对直接序列化List支持有限)
[Serializable]
public class GameObjectListWrapper
{
    public List<Mycustom_gameobject_list> gameObjectItems;
}

// 序列化代码
public static void SaveLocalPayloads(List<Mycustom_gameobject_list> savelist)
{
    Debug.Log(savelist.Count);
    var wrapper = new GameObjectListWrapper { gameObjectItems = savelist };
    string convertData = JsonUtility.ToJson(wrapper);
    Debug.Log(convertData);
}

内容的提问来源于stack exchange,提问作者aron kan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:46:02