Unity 5 GameObject serialization
本文关键字:serialization GameObject Unity | 更新日期: 2023-09-27 18:06:17
我正在尝试用Newtonsoft.Json序列化整个GameObject。当我用JsonConvert序列化对象时,它抛出一个错误:
NotSupportedException: rigidbody property has been deprecated
UnityEngine.GameObject.get_rigidbody () (at C:/buildslave/unity/build/Runtime/Export/UnityEngineGameObject_Deprecated.cs:23)
(wrapper dynamic-method) UnityEngine.GameObject.Getrigidbody (object) <IL 0x00006, 0x00073>
Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (object) (at Assets/JsonDotNet/Source/Serialization/DynamicValueProvider.cs:104)
Rethrow as JsonSerializationException: Error getting value from 'rigidbody' on 'UnityEngine.GameObject'.
Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue (System.Object target) (at Assets/JsonDotNet/Source/Serialization/DynamicValueProvider.cs:108)
Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (Newtonsoft.Json.JsonWriter writer, System.Object value, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContract collectionValueContract) (at Assets/JsonDotNet/Source/Serialization/JsonSerializerInternalWriter.cs:338)
为什么会这样?
这里有问题:
public object GetValue(object target)
{
try
{
if (_getter == null)
_getter = DynamicReflectionDelegateFactory.Instance.CreateGet<object>(_memberInfo);
return _getter(target);
}
catch (Exception ex)
{
throw new JsonSerializationException("Error getting value from '{0}' on '{1}'.".FormatWith(CultureInfo.InvariantCulture, _memberInfo.Name, target.GetType()), ex);
}
}
它是DynamicValueProvider.cs的一部分
我不知道Newtonsoft。但从错误信息判断- GameObject属性rigidbody
在Unity 5中连同其他一些常见的属性getter已被弃用,见这里和这里。
所有对rigidbody
的调用必须替换为GetComponent<Rigidbody>()
我解决这个问题的方法是让Newtonsoft只序列化我感兴趣的字段。要将属性序列化为"白名单",你可以在你的类中添加[JsonObject(MemberSerialization.OptIn)]标签,并在你感兴趣的属性中添加[JsonProperty]。
如果你的意图是在Monobehaviour中序列化Unity的属性,那么显然这对你来说是行不通的。
错误信息是假的。这是因为JsonConvert执行序列化的方式,通过它的方式遍历所有属性。谁先失败多少是随机的。
真正的问题是从MonoBehaviour派生的类不能简单地序列化。您需要找到一种方法来序列化您感兴趣的数据值,而不是整个类。
搜索' serialize MonoBehaviour'以获得一些如何做到这一点的想法。推荐的方法是使用ScriptableObject。