Example #1
0
        public override void FindDependencies <T>(Dictionary <long, T> dependencies, Dictionary <long, T> objects, bool allowNulls)
        {
            base.FindDependencies(dependencies, objects, allowNulls);

            if (baseObjectData != null)
            {
                baseObjectData.FindDependencies(dependencies, objects, allowNulls);
            }

            Type type = Type.GetType(TypeName);

            if (type == null)
            {
                Debug.LogWarning(TypeName + " is not found");
                return;
            }

            if (!type.IsScript())
            {
                throw new ArgumentException(string.Format("obj of type {0} is not subclass of {1}", type, typeof(MonoBehaviour)), "obj");
            }

            do
            {
                FieldInfo[] fields = type.GetSerializableFields();
                for (int i = 0; i < fields.Length; ++i)
                {
                    FieldInfo field = fields[i];
                    string    name  = field.Name;
                    if (!this.fields.ContainsKey(field.Name))
                    {
                        FormerlySerializedAsAttribute formelySerializedAs = field.GetCustomAttributes(typeof(FormerlySerializedAsAttribute), false).FirstOrDefault() as FormerlySerializedAsAttribute;
                        if (formelySerializedAs == null)
                        {
                            continue;
                        }
                        name = formelySerializedAs.oldName;
                        if (!this.fields.ContainsKey(name))
                        {
                            continue;
                        }
                    }

                    bool isArray   = field.FieldType.IsArray;
                    Type fieldType = field.FieldType;
                    if (isArray)
                    {
                        fieldType = fieldType.GetElementType();
                    }

                    DataContract value = this.fields[name];
                    if (fieldType.IsSubclassOf(typeof(UnityObject)) || fieldType == typeof(UnityObject))
                    {
                        if (isArray)
                        {
                            if (!(value.AsPrimitive.ValueBase is long[]))
                            {
                                continue;
                            }

                            long[] instanceIds = (long[])value.AsPrimitive.ValueBase;
                            AddDependencies(instanceIds, dependencies, objects, allowNulls);
                        }
                        else
                        {
                            if (!(value.AsPrimitive.ValueBase is long))
                            {
                                continue;
                            }

                            long instanceId = (long)value.AsPrimitive.ValueBase;
                            AddDependency(instanceId, dependencies, objects, allowNulls);
                        }
                    }
                    else
                    {
                        if (value.Data != null)
                        {
                            if (field.FieldType.IsSubclassOf(typeof(UnityEventBase)))
                            {
                                PersistentUnityEventBase persistentUnityEvent = value.AsUnityEvent;
                                persistentUnityEvent.FindDependencies(dependencies, objects, allowNulls);
                            }
                        }
                        else
                        {
                            if (!field.FieldType.IsEnum())
                            {
                                object fieldValue;
                                if (field.FieldType.IsPrimitive() || field.FieldType.IsArray())
                                {
                                    PrimitiveContract primitive = value.AsPrimitive;
                                    if (primitive == null ||
                                        primitive.ValueBase == null && field.FieldType.IsValueType() ||
                                        primitive.ValueBase != null && !field.FieldType.IsAssignableFrom(primitive.ValueBase.GetType()))
                                    {
                                        continue;
                                    }
                                    fieldValue = primitive.ValueBase;
                                }
                                else
                                {
                                    fieldValue = value.Data;
                                }

                                if (fieldValue is IEnumerable)
                                {
                                    IEnumerable enumerable = (IEnumerable)fieldValue;
                                    foreach (object o in enumerable)
                                    {
                                        if (o is IRTSerializable)
                                        {
                                            IRTSerializable rtSerializable = (IRTSerializable)o;
                                            rtSerializable.FindDependencies(dependencies, objects, allowNulls);
                                        }
                                    }
                                }
                                else
                                {
                                    if (fieldValue is IRTSerializable)
                                    {
                                        IRTSerializable rtSerializable = (IRTSerializable)fieldValue;
                                        rtSerializable.FindDependencies(dependencies, objects, allowNulls);
                                    }
                                }
                            }
                        }
                    }
                }
                type = type.BaseType();
            }while (type.IsScript());
        }
Example #2
0
 public DataContract(PrimitiveContract primitive)
 {
     Data = primitive;
 }
Example #3
0
        public override void ReadFrom(object obj)
        {
            base.ReadFrom(obj);

            if (baseObjectData != null)
            {
                baseObjectData.ReadFrom(obj);
            }

            Type type = obj.GetType();

            if (!type.IsScript())
            {
                throw new ArgumentException(string.Format("obj of type {0} is not subclass of {1}", type, typeof(MonoBehaviour)), "obj");
            }

            TypeName = type.AssemblyQualifiedName;

            do
            {
                FieldInfo[] fields = type.GetSerializableFields();
                for (int i = 0; i < fields.Length; ++i)
                {
                    FieldInfo field = fields[i];

                    if (this.fields.ContainsKey(field.Name))
                    {
                        Debug.LogErrorFormat("Fields with same names are not supported. Field name {0}", field.Name);
                        continue;
                    }

                    bool isArray   = field.FieldType.IsArray;
                    Type fieldType = field.FieldType;
                    if (isArray)
                    {
                        fieldType = fieldType.GetElementType();
                    }

                    if (fieldType.IsSubclassOf(typeof(UnityObject)) || fieldType == typeof(UnityObject))
                    {
                        if (isArray)
                        {
                            UnityObject[] unityObjects = (UnityObject[])field.GetValue(obj);
                            if (unityObjects != null)
                            {
                                long[] ids = new long[unityObjects.Length];
                                for (int j = 0; j < ids.Length; ++j)
                                {
                                    ids[j] = unityObjects[j].GetMappedInstanceID();
                                }
                                this.fields.Add(field.Name, new DataContract(PrimitiveContract.Create(ids)));
                            }
                            else
                            {
                                this.fields.Add(field.Name, new DataContract(PrimitiveContract.Create(new long[0])));
                            }
                        }
                        else
                        {
                            UnityObject unityObject = (UnityObject)field.GetValue(obj);
                            this.fields.Add(field.Name, new DataContract(PrimitiveContract.Create(unityObject.GetMappedInstanceID())));
                        }
                    }
                    else
                    {
                        if (fieldType.IsSubclassOf(typeof(UnityEventBase)))
                        {
                            UnityEventBase unityEvent = (UnityEventBase)field.GetValue(obj);
                            if (unityEvent != null)
                            {
                                PersistentUnityEventBase persistentUnityEvent = new PersistentUnityEventBase();
                                persistentUnityEvent.ReadFrom(unityEvent);
                                this.fields.Add(field.Name, new DataContract(persistentUnityEvent));
                            }
                        }
                        else
                        {
                            if (!field.FieldType.IsEnum())
                            {
                                object fieldValue = field.GetValue(obj);
                                if (typeof(IEnumerable).IsAssignableFrom(field.FieldType))
                                {
                                    IEnumerable enumerable = (IEnumerable)fieldValue;
                                    foreach (object o in enumerable)
                                    {
                                        if (o is IRTSerializable)
                                        {
                                            IRTSerializable rtSerializable = (IRTSerializable)o;
                                            rtSerializable.Serialize();
                                        }
                                    }
                                }
                                else
                                {
                                    if (fieldValue is IRTSerializable)
                                    {
                                        IRTSerializable rtSerializable = (IRTSerializable)fieldValue;
                                        rtSerializable.Serialize();
                                    }
                                }

                                if (field.FieldType.IsPrimitive() || field.FieldType.IsArray())
                                {
                                    PrimitiveContract primitive = PrimitiveContract.Create(field.FieldType);
                                    primitive.ValueBase = fieldValue;
                                    this.fields.Add(field.Name, new DataContract(primitive));
                                }
                                else
                                {
                                    this.fields.Add(field.Name, new DataContract {
                                        Data = fieldValue
                                    });
                                }
                            }
                            else
                            {
                                //Debug.Log("Want to create primitive contract for " + field.FieldType);
                                PrimitiveContract primitive = PrimitiveContract.Create(typeof(uint));
                                primitive.ValueBase = (uint)Convert.ChangeType(field.GetValue(obj), typeof(uint));
                                this.fields.Add(field.Name, new DataContract(primitive));
                            }
                        }
                    }
                }

                type = type.BaseType();
            }while (type.IsScript());
        }
Example #4
0
        public override object WriteTo(object obj, Dictionary <long, UnityObject> objects)
        {
            obj = base.WriteTo(obj, objects);

            if (baseObjectData != null)
            {
                //prevent name to be overriden with name stored m_baseObjectData.name
                PersistentObjects.PersistentObject persistentObj = baseObjectData.AsPersistentObject;
                if (persistentObj != null)
                {
                    persistentObj.name = name;
                }
                baseObjectData.WriteTo(obj, objects);
            }

            Type type = obj.GetType();

            if (!type.IsScript())
            {
                throw new ArgumentException(string.Format("obj of type {0} is not subclass of {1}", type, typeof(MonoBehaviour)), "obj");
            }

            do
            {
                FieldInfo[] fields = type.GetSerializableFields();
                for (int i = 0; i < fields.Length; ++i)
                {
                    FieldInfo field = fields[i];
                    string    name  = field.Name;
                    if (!this.fields.ContainsKey(field.Name))
                    {
                        FormerlySerializedAsAttribute formelySerializedAs = field.GetCustomAttributes(typeof(FormerlySerializedAsAttribute), false).FirstOrDefault() as FormerlySerializedAsAttribute;
                        if (formelySerializedAs == null)
                        {
                            continue;
                        }
                        name = formelySerializedAs.oldName;
                        if (!this.fields.ContainsKey(name))
                        {
                            continue;
                        }
                    }

                    bool isArray   = field.FieldType.IsArray;
                    Type fieldType = field.FieldType;
                    if (isArray)
                    {
                        fieldType = fieldType.GetElementType();
                    }

                    DataContract value = this.fields[name];
                    if (fieldType.IsSubclassOf(typeof(UnityObject)) || fieldType == typeof(UnityObject))
                    {
                        if (isArray)
                        {
                            if (value.AsPrimitive == null)
                            {
                                continue;
                            }

                            if (!(value.AsPrimitive.ValueBase is long[]))
                            {
                                continue;
                            }

                            long[] instanceIds = (long[])value.AsPrimitive.ValueBase;
                            Array  objectsFoundByInstanceId = Array.CreateInstance(fieldType, instanceIds.Length);
                            for (int j = 0; j < instanceIds.Length; ++j)
                            {
                                object o = objects.Get(instanceIds[j]);
                                objectsFoundByInstanceId.SetValue(o, j);
                            }
                            field.SetValue(obj, objectsFoundByInstanceId);
                        }
                        else
                        {
                            if (value.AsPrimitive == null)
                            {
                                continue;
                            }
                            if (!(value.AsPrimitive.ValueBase is long))
                            {
                                continue;
                            }

                            long instanceId = (long)value.AsPrimitive.ValueBase;
                            if (!objects.ContainsKey(instanceId))
                            {
                                continue;
                            }

                            object objectFoundByInstanceId = objects[instanceId];
                            try
                            {
                                field.SetValue(obj, objectFoundByInstanceId);
                            }
                            catch
                            {
                                Debug.LogError(instanceId);
                                throw;
                            }
                        }
                    }
                    else
                    {
                        if (value == null)
                        {
                            if (field.FieldType.IsValueType())
                            {
                                continue;
                            }
                            field.SetValue(obj, value);
                        }
                        else
                        {
                            if (field.FieldType.IsSubclassOf(typeof(UnityEventBase)))
                            {
                                if (value.AsUnityEvent == null)
                                {
                                    continue;
                                }
                                PersistentUnityEventBase persistentUnityEvent = value.AsUnityEvent;
                                UnityEventBase           unityEvent           = (UnityEventBase)Activator.CreateInstance(field.FieldType);
                                persistentUnityEvent.WriteTo(unityEvent, objects);
                                field.SetValue(obj, unityEvent);
                            }
                            else
                            {
                                if (!field.FieldType.IsEnum())
                                {
                                    object fieldValue;
                                    if (field.FieldType.IsPrimitive() || field.FieldType.IsArray())
                                    {
                                        PrimitiveContract primitive = value.AsPrimitive;
                                        if (primitive == null ||
                                            primitive.ValueBase == null && field.FieldType.IsValueType() ||
                                            primitive.ValueBase != null && !field.FieldType.IsAssignableFrom(primitive.ValueBase.GetType()))
                                        {
                                            continue;
                                        }
                                        fieldValue = primitive.ValueBase;
                                    }
                                    else
                                    {
                                        fieldValue = value.Data;
                                    }

                                    field.SetValue(obj, fieldValue);
                                    if (fieldValue is IEnumerable)
                                    {
                                        IEnumerable enumerable = (IEnumerable)fieldValue;
                                        foreach (object o in enumerable)
                                        {
                                            if (o is IRTSerializable)
                                            {
                                                IRTSerializable rtSerializable = (IRTSerializable)o;
                                                rtSerializable.Deserialize(objects);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if (fieldValue is IRTSerializable)
                                        {
                                            IRTSerializable rtSerializable = (IRTSerializable)fieldValue;
                                            rtSerializable.Deserialize(objects);
                                        }
                                    }
                                }
                                else// if (field.FieldType.IsEnum)
                                {
                                    PrimitiveContract primitive = value.AsPrimitive;
                                    if (primitive == null ||
                                        primitive.ValueBase == null && field.FieldType.IsValueType() ||
                                        primitive.ValueBase != null && primitive.ValueBase.GetType() != typeof(uint))
                                    {
                                        continue;
                                    }

                                    var val = Enum.ToObject(field.FieldType, primitive.ValueBase);
                                    field.SetValue(obj, val);
                                }
                            }
                        }
                    }
                }
                type = type.BaseType();
            }while (type.IsScript());

            return(obj);
        }