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); }
报错原因
- GameObject无法直接序列化:
GameObject是Unity内置核心类型,包含大量内部引用、未序列化字段,Json.NET无法处理这类复杂对象,会触发循环引用或访问权限错误。 - 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
相关产品推荐
相关产品推荐

