123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- using System;
- using UnityEngine;
- using System.Globalization;
- #if UNITY_EDITOR
- using UnityEditor;
- #endif
- namespace GraphProcessor
- {
- // Warning: this class only support the serialization of UnityObject and primitive
- [System.Serializable]
- public class SerializableObject
- {
- [System.Serializable]
- class ObjectWrapper
- {
- public UnityEngine.Object value;
- }
- public string serializedType;
- public string serializedName;
- public string serializedValue;
- public object value;
- public SerializableObject(object value, Type type, string name = null)
- {
- this.value = value;
- this.serializedName = name;
- this.serializedType = type.AssemblyQualifiedName;
- }
- public void Deserialize()
- {
- if (String.IsNullOrEmpty(serializedType))
- {
- Debug.LogError("Can't deserialize the object from null type");
- return;
- }
- Type type = Type.GetType(serializedType);
- if (type.IsPrimitive)
- {
- if (string.IsNullOrEmpty(serializedValue))
- value = Activator.CreateInstance(type);
- else
- value = Convert.ChangeType(serializedValue, type, CultureInfo.InvariantCulture);
- }
- else if (typeof(UnityEngine.Object).IsAssignableFrom(type))
- {
- ObjectWrapper obj = new ObjectWrapper();
- JsonUtility.FromJsonOverwrite(serializedValue, obj);
- value = obj.value;
- }
- else if (type == typeof(string))
- value = serializedValue.Length > 1 ? serializedValue.Substring(1, serializedValue.Length - 2).Replace("\\\"", "\"") : "";
- else
- {
- try {
- value = Activator.CreateInstance(type);
- JsonUtility.FromJsonOverwrite(serializedValue, value);
- } catch (Exception e){
- Debug.LogError(e);
- Debug.LogError("Can't serialize type " + serializedType);
- }
- }
- }
- public void Serialize()
- {
- if (value == null)
- return ;
- serializedType = value.GetType().AssemblyQualifiedName;
- if (value.GetType().IsPrimitive)
- serializedValue = Convert.ToString(value, CultureInfo.InvariantCulture);
- else if (value is UnityEngine.Object) //type is a unity object
- {
- if ((value as UnityEngine.Object) == null)
- return ;
- ObjectWrapper wrapper = new ObjectWrapper { value = value as UnityEngine.Object };
- serializedValue = JsonUtility.ToJson(wrapper);
- }
- else if (value is string)
- serializedValue = "\"" + ((string)value).Replace("\"", "\\\"") + "\"";
- else
- {
- try {
- serializedValue = JsonUtility.ToJson(value);
- if (String.IsNullOrEmpty(serializedValue))
- throw new Exception();
- } catch {
- Debug.LogError("Can't serialize type " + serializedType);
- }
- }
- }
- }
- }
|