Unity 5 GameObject序列化

时间:2015-08-03 11:50:15

标签: c# json serialization unity3d gameobject

我正在尝试使用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的一部分

3 个答案:

答案 0 :(得分:1)

我不知道Newtonsoft.Json,但是从错误消息判断 - 在Unity 5中已经弃用了GameObject属性rigidbody以及其他一些常见的属性getter,请参阅here和{{ 3}}。

所有对rigidbody的来电都必须替换为GetComponent<Rigidbody>()

答案 1 :(得分:0)

错误消息是虚假的。之所以发生这种情况,是因为JsonConvert通过遍历所有属性的方式执行序列化。谁先失败多少是随机的。

真正的问题是,不能简单地序列化从MonoBehaviour派生的类。您需要找到一种方法来序列化您感兴趣的数据值,而不是整个类。

搜索“ serialise MonoBehaviour”(序列化MonoBehaviour),以获取一些有关如何做到这一点的想法。推荐的方法是使用ScriptableObject。

答案 2 :(得分:0)

我要解决的问题是让Newtonsoft只序列化我感兴趣的字段。要“白名单”要序列化的属性,可以在类中添加[JsonObject(MemberSerialization.OptIn)]标记,和[JsonProperty]到您感兴趣的属性。

尽管如果您打算在Monobehaviour中序列化Unity的属性,那么显然这对您不起作用。