示例#1
0
        public int Store(object obj, bool writeProperties = true)
        {
            //storing nulls to -1
            if (obj == null)
            {
                return(-1);
            }

            //if this object already added returning it's num
            int entitiesCount = entities.Count;

            for (int i = 0; i < entitiesCount; i++)
            {
                if (obj == entities[i].obj)
                {
                    return(i);
                }
            }

            //creating entity
            SerializedObject entity = new SerializedObject();

            System.Type objType = obj.GetType();
            entity.typeName = objType.AssemblyQualifiedName.ToString();
            entity.obj      = obj;

            //adding entity to list before storing other objs
            entities.Add(entity);
            int result = entities.Count - 1;

            //writing arrays
            if (objType.IsArray)
            {
                Array       array       = (Array)obj;
                System.Type elementType = objType.GetElementType();
                entity.AddValues(elementType, array, this);
                //for (int i=0;i<array.Length;i++) entity.AddValue(elementType, array.GetValue(i), "", this);
                return(result);
            }

            //writing fields
            FieldInfo[] fields = objType.GetFields(BindingFlags.Public | BindingFlags.Instance);             //BindingFlags.NonPublic - does not work in web player
            for (int i = 0; i < fields.Length; i++)
            {
                FieldInfo field = fields[i];
                if (field.IsLiteral)
                {
                    continue;                                  //leaving constant fields blank
                }
                if (field.FieldType.IsPointer)
                {
                    continue;                                            //skipping pointers (they make unity crash. Maybe require unsafe)
                }
                if (field.IsNotSerialized)
                {
                    continue;
                }

                entity.AddValue(field.FieldType, field.GetValue(obj), field.Name, this);
            }

            //writing properties
            if (writeProperties)
            {
                PropertyInfo[] properties = objType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
                for (int i = 0; i < properties.Length; i++)
                {
                    PropertyInfo prop = properties[i];
                    if (!prop.CanWrite)
                    {
                        continue;
                    }
                    if (prop.Name == "Item")
                    {
                        continue;                                          //ignoring this[x]
                    }
                    entity.AddValue(prop.PropertyType, prop.GetValue(obj, null), prop.Name, this);
                }
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// 存储对象
        /// </summary>
        /// <param name="iObj">对象</param>
        /// <param name="iWriteProperties">属性写入标识位</param>
        /// <returns>-1:失败或者未写入任何内容;其他:被写入实体列表中的索引值;</returns>
        public int Store(object iObj, bool iWriteProperties = true)
        {
            //storing nulls to -1
            if (iObj == null)
            {
                return(-1);
            }

            // 遍历当前实体列表,看是否已经存在。若存在,则返回索引
            var entitiesCount = entities.Count;

            for (var i = 0; i < entitiesCount; i++)
            {
                if (iObj == entities[i].obj)
                {
                    return(i);
                }
            }

            // 创建新的序列化对象
            var entity  = new SerializedObject();
            var objType = iObj.GetType();

            entity.typeName = objType.AssemblyQualifiedName;
            entity.obj      = iObj;

            //adding entity to list before storing other objs
            entities.Add(entity);
            var index = entities.Count - 1;

            // 数组
            if (objType.IsArray)
            {
                var array       = (Array)iObj;
                var elementType = objType.GetElementType();
                entity.AddValues(elementType, array, this);
                //for (int i=0;i<array.Length;i++) entity.AddValue(elementType, array.GetValue(i), "", this);
                return(index);
            }

            // 获取字段信息
            var fields = objType.GetFields(BindingFlags.Public | BindingFlags.Instance);             //BindingFlags.NonPublic - does not work in web player

            for (var i = 0; i < fields.Length; i++)
            {
                var field = fields[i];
                // 若是编译时写入,且不能修改
                if (field.IsLiteral)
                {
                    continue;                                  //leaving constant fields blank
                }
                // 指针类型
                if (field.FieldType.IsPointer)
                {
                    continue;                                            //skipping pointers (they make unity crash. Maybe require unsafe)
                }
                // 非序列化对象
                if (field.IsNotSerialized)
                {
                    continue;
                }

                entity.AddValue(field.FieldType, field.GetValue(iObj), field.Name, this);
            }

            //writing properties
            if (!iWriteProperties)
            {
                return(index);
            }

            var properties = objType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            for (var i = 0; i < properties.Length; i++)
            {
                var prop = properties[i];
                // 不可写
                if (!prop.CanWrite)
                {
                    continue;
                }
                if (prop.Name == "Item")
                {
                    continue;                                      //ignoring this[x]
                }
                entity.AddValue(prop.PropertyType, prop.GetValue(iObj, null), prop.Name, this);
            }

            return(index);
        }