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 сериализовать только те поля, которые меня интересуют. Чтобы "занести в белый список" ваши свойства для сериализации, вы можете добавить тег [JsonObject(MemberSerialization.OptIn)] в свой класс и [JsonProperty] к интересующим вас свойствам.
Хотя, если вы намерены сериализовать свойства Unity в Monobehaviour, то, очевидно, это не сработает для вас.
Сообщение об ошибке является ложным. Это происходит из-за того, как JsonConvert выполняет сериализацию, проходя через все свойства. Это более или менее случайный, который первым терпит неудачу.
Реальная проблема заключается в том, что классы, производные от MonoBehaviour, нельзя просто сериализовать. Вам нужно найти способ сериализации значений, которые вас интересуют, а не всего класса.
Ищите "сериализировать MonoBehaviour", чтобы получить некоторые идеи, как это сделать. Рекомендуемый способ - использовать ScriptableObject.