Unity 5 GameObject сериализация

Я пытаюсь сериализовать весь GameObject с помощью Newtonsoft.Json. Когда я сериализую объект с 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

1 ответ

Я не знаю о Newtonsoft.Json, но судя по сообщению об ошибке - свойство GameObject rigidbody устарел в Unity 5 вместе с некоторыми другими распространителями общих свойств, см. здесь и здесь.

Все звонки на rigidbody должен быть заменен на GetComponent<Rigidbody>() вместо.

Что я сделал для решения этой проблемы, так это заставил Newtonsoft сериализовать только те поля, которые меня интересуют. Чтобы "занести в белый список" ваши свойства для сериализации, вы можете добавить тег [JsonObject(MemberSerialization.OptIn)] в свой класс и [JsonProperty] к интересующим вас свойствам.

Хотя, если вы намерены сериализовать свойства Unity в Monobehaviour, то, очевидно, это не сработает для вас.

Сообщение об ошибке является ложным. Это происходит из-за того, как JsonConvert выполняет сериализацию, проходя через все свойства. Это более или менее случайный, который первым терпит неудачу.

Реальная проблема заключается в том, что классы, производные от MonoBehaviour, нельзя просто сериализовать. Вам нужно найти способ сериализации значений, которые вас интересуют, а не всего класса.

Ищите "сериализировать MonoBehaviour", чтобы получить некоторые идеи, как это сделать. Рекомендуемый способ - использовать ScriptableObject.

Другие вопросы по тегам