コード例 #1
0
        public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
        {
            serialized = fsData.CreateDictionary();
            var result = fsResult.Success;

            fsMetaType metaType = fsMetaType.Get(Serializer.Config, instance.GetType());

            metaType.EmitAotData();

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];
                if (property.CanRead == false)
                {
                    continue;
                }

                fsData serializedData;

                var itemResult = Serializer.TrySerialize(property.StorageType, property.OverrideConverterType,
                                                         property.Read(instance), out serializedData);
                result.AddMessages(itemResult);
                if (itemResult.Failed)
                {
                    continue;
                }

                serialized.AsDictionary[property.JsonName] = serializedData;
            }

            return(result);
        }
コード例 #2
0
        public override fsFailure TryDeserialize(fsData data, ref object instance, Type storageType)
        {
            if (data.IsDictionary == false)
            {
                return(fsFailure.Fail("Reflected converter requires a dictionary for data"));
            }

            fsMetaType metaType = fsMetaType.Get(storageType);

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];

                fsData propertyData;
                if (data.AsDictionary.TryGetValue(property.Name, out propertyData))
                {
                    object deserializedValue = null;
                    var    failed            = Serializer.TryDeserialize(propertyData, property.StorageType, ref deserializedValue);
                    if (failed.Failed)
                    {
                        return(failed);
                    }

                    property.Write(instance, deserializedValue);
                }
            }

            return(fsFailure.Success);
        }
コード例 #3
0
        public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
        {
            var result = fsResult.Success;

            // Verify that we actually have an Object
            if ((result += CheckType(data, fsDataType.Object)).Failed)
            {
                return(result);
            }

            if (data.AsDictionary.Count == 0)
            {
                return(fsResult.Success);
            }

            //
            fsMetaType metaType = fsMetaType.Get(Serializer.Config, storageType);

            metaType.EmitAotData();

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];
                if (property.CanWrite == false)
                {
                    continue;
                }

                fsData propertyData;
                if (data.AsDictionary.TryGetValue(property.JsonName, out propertyData))
                {
                    object deserializedValue = null;

/*
 *                  // We have to read in the existing value, since we need to support partial
 *                  // deserialization. However, this is bad for perf.
 *                  // TODO: Find a way to avoid this call when we are not doing a partial deserialization
 *                  //       Maybe through a new property, ie, Serializer.IsPartialSerialization, which just
 *                  //       gets set when starting a new serialization? We cannot pipe the information
 *                  //       through CreateInstance unfortunately.
 *                  if (property.CanRead) {
 *                      deserializedValue = property.Read(instance);
 *                  }
 */
                    // 递归下去
                    var itemResult = Serializer.TryDeserialize(propertyData, property.StorageType,
                                                               property.OverrideConverterType, ref deserializedValue);
                    result.AddMessages(itemResult);
                    if (itemResult.Failed)
                    {
                        continue;
                    }

                    // 往instance的property写入deserializedValue数据
                    property.Write(instance, deserializedValue);
                }
            }

            return(result);
        }
コード例 #4
0
        public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
        {
            serialized = fsData.CreateDictionary();
            var result = fsResult.Success;

            fsMetaType metaType = fsMetaType.Get(instance.GetType());

            //Dont do this for UnityObject. While there is fsUnityObjectConverter, this converter is also used as override,
            //when serializing a UnityObject directly.
            object defaultInstance = null;

            if (fsGlobalConfig.SerializeDefaultValues == false && !(instance is UnityEngine.Object))
            {
                defaultInstance = metaType.GetDefaultInstance();
            }

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];

                if (property.WriteOnly)
                {
                    continue;
                }

                if (property.AsReference && Serializer.IgnoreSerializeCycleReferences)
                {
                    continue;
                }

                var propertyValue = property.Read(instance);

                // auto instance?
                if (propertyValue == null && property.AutoInstance)
                {
                    propertyValue = fsMetaType.Get(property.StorageType).CreateInstance();
                    property.Write(instance, propertyValue);
                }
                else if (fsGlobalConfig.SerializeDefaultValues == false && defaultInstance != null)
                {
                    if (Equals(propertyValue, property.Read(defaultInstance)))
                    {
                        continue;
                    }
                }

                fsData serializedData;
                var    itemResult = Serializer.TrySerialize(property.StorageType, propertyValue, out serializedData);
                result.AddMessages(itemResult);
                if (itemResult.Failed)
                {
                    continue;
                }

                serialized.AsDictionary[property.JsonName] = serializedData;
            }

            return(result);
        }
コード例 #5
0
        public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
        {
            // 传进来的serialized 直接赋值一个Dict
            serialized = fsData.CreateDictionary();
            var result = fsResult.Success;

            // Serializer.Config 就是一些配置
            fsMetaType metaType = fsMetaType.Get(Serializer.Config, instance.GetType());

            metaType.EmitAotData();

            //PARADOXNOTION ADDITION
            object defaultInstance = null;

            //Dont do this for UnityObject. While there is fsUnityObjectConverter, this converter is also used as override,
            //when serializing a UnityObject directly.
            if (fsGlobalConfig.SerializeDefaultValues == false && !(instance is UnityEngine.Object))
            {
                defaultInstance = metaType.CreateInstance();
            }
            //

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];
                // 不可读的跳过
                if (property.CanRead == false)
                {
                    continue;
                }

                // 如果是不存储默认值的情况
                //PARADOXNOTION ADDITION
                if (fsGlobalConfig.SerializeDefaultValues == false && defaultInstance != null)
                {
                    if (Equals(property.Read(instance), property.Read(defaultInstance)))
                    {
                        continue;
                    }
                }
                //

                fsData serializedData;

                // property.Read(instance) 理解为从某一个实例读取某一个属性,字段值
                var itemResult = Serializer.TrySerialize(property.StorageType, property.OverrideConverterType,
                                                         property.Read(instance), out serializedData);
                result.AddMessages(itemResult);
                if (itemResult.Failed)
                {
                    continue;
                }

                serialized.AsDictionary[property.JsonName] = serializedData;
            }

            return(result);
        }
コード例 #6
0
        public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
        {
            var result = fsResult.Success;

            // Verify that we actually have an Object
            if ((result += CheckType(data, fsDataType.Object)).Failed)
            {
                return(result);
            }

            fsMetaType metaType = fsMetaType.Get(Serializer.Config, storageType);

            metaType.EmitAotData(/*throwException:*/ false);

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];
                if (property.CanWrite == false)
                {
                    continue;
                }

                fsData propertyData;
                if (data.AsDictionary.TryGetValue(property.JsonName, out propertyData))
                {
                    object deserializedValue = null;

                    // We have to read in the existing value, since we need to
                    // support partial deserialization. However, this is bad for
                    // perf.

                    //       a partial deserialization Maybe through a new
                    //       property, ie, Serializer.IsPartialSerialization,
                    //       which just gets set when starting a new
                    //       serialization? We cannot pipe the information
                    //       through CreateInstance unfortunately.
                    if (property.CanRead)
                    {
                        deserializedValue = property.Read(instance);
                    }

                    var itemResult = Serializer.TryDeserialize(propertyData, property.StorageType,
                                                               property.OverrideConverterType, ref deserializedValue);
                    result.AddMessages(itemResult);
                    if (itemResult.Failed)
                    {
                        continue;
                    }

                    property.Write(instance, deserializedValue);
                }
            }

            return(result);
        }
コード例 #7
0
        public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
        {
            var result = fsResult.Success;

            // Verify that we actually have an Object
            if ((result += CheckType(data, fsDataType.Object)).Failed)
            {
                return(result);
            }

            if (data.AsDictionary.Count == 0)
            {
                return(fsResult.Success);
            }

            fsMetaType metaType = fsMetaType.Get(storageType);

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];

                if (property.ReadOnly)
                {
                    continue;
                }

                fsData propertyData;
                if (data.AsDictionary.TryGetValue(property.JsonName, out propertyData))
                {
                    object deserializedValue = null;

                    //This does not work well with no serializing default values -> Find a workaround.
                    if (fsGlobalConfig.SerializeDefaultValues)
                    {
                        if (metaType.DeserializeOverwriteRequest || typeof(ICollection).IsAssignableFrom(storageType))
                        {
                            deserializedValue = property.Read(instance);
                        }
                    }

                    var itemResult = Serializer.TryDeserialize(propertyData, property.StorageType, ref deserializedValue, null);
                    result.AddMessages(itemResult);
                    if (itemResult.Failed)
                    {
                        continue;
                    }

                    property.Write(instance, deserializedValue);
                }
            }

            return(result);
        }
コード例 #8
0
        // Token: 0x06000466 RID: 1126 RVA: 0x0001C52C File Offset: 0x0001A72C
        public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
        {
            fsResult fsResult = fsResult.Success;
            fsResult fsResult2;

            fsResult = (fsResult2 = fsResult + base.CheckType(data, fsDataType.Object));
            if (fsResult2.Failed)
            {
                return(fsResult);
            }
            fsMetaType fsMetaType = fsMetaType.Get(this.Serializer.Config, storageType);

            fsMetaType.EmitAotData();
            for (int i = 0; i < fsMetaType.Properties.Length; i++)
            {
                fsMetaProperty property = fsMetaType.Properties[i];
                if (property.CanWrite)
                {
                    fsData data2;
                    if (data.AsDictionary.TryGetValue(property.JsonName, out data2))
                    {
                        int referenceId = fsBaseConverter.GetReferenceId(data2);
                        if (referenceId != -1 && this.Serializer.IsObjectVersionedAndUnderConstruction(referenceId))
                        {
                            object temp = instance;
                            this.Serializer.WhenInstanceCreated(referenceId, delegate(object refObject)
                            {
                                property.Write(temp, refObject);
                            });
                        }
                        else
                        {
                            object value = null;
                            if (property.CanRead)
                            {
                                value = property.Read(instance);
                            }
                            fsResult result = this.Serializer.TryDeserialize(data2, property.StorageType, property.OverrideConverterType, ref value);
                            fsResult.AddMessages(result);
                            if (!result.Failed)
                            {
                                property.Write(instance, value);
                            }
                        }
                    }
                }
            }
            return(fsResult);
        }
コード例 #9
0
    public static fsMetaType Get(fsConfig config, Type type)
    {
        Dictionary <Type, fsMetaType> metaTypes;

        if (_configMetaTypes.TryGetValue(config, out metaTypes) == false)
        {
            metaTypes = _configMetaTypes[config] = new Dictionary <Type, fsMetaType>();
        }

        fsMetaType metaType;

        if (metaTypes.TryGetValue(type, out metaType) == false)
        {
            metaType        = new fsMetaType(config, type);
            metaTypes[type] = metaType;
        }

        return(metaType);
    }
コード例 #10
0
        public override fsResult TryDeserialize(fsData data, ref object instance, Type storageType)
        {
            var result = fsResult.Success;

            // Verify that we actually have an Object
            if ((result += CheckType(data, fsDataType.Object)).Failed)
            {
                return(result);
            }

            fsMetaType metaType = fsMetaType.Get(storageType);

            metaType.EmitAotData();

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];
                if (property.CanWrite == false)
                {
                    continue;
                }

                fsData propertyData;
                if (data.AsDictionary.TryGetValue(property.JsonName, out propertyData))
                {
                    object deserializedValue = null;

                    var itemResult = Serializer.TryDeserialize(propertyData, property.StorageType, ref deserializedValue);
                    result.AddMessages(itemResult);
                    if (itemResult.Failed)
                    {
                        continue;
                    }

                    property.Write(instance, deserializedValue);
                }
            }

            return(result);
        }
コード例 #11
0
        // Token: 0x06000465 RID: 1125 RVA: 0x0001C470 File Offset: 0x0001A670
        public override fsResult TrySerialize(object instance, out fsData serialized, Type storageType)
        {
            serialized = fsData.CreateDictionary();
            fsResult   success    = fsResult.Success;
            fsMetaType fsMetaType = fsMetaType.Get(this.Serializer.Config, instance.GetType());

            fsMetaType.EmitAotData();
            for (int i = 0; i < fsMetaType.Properties.Length; i++)
            {
                fsMetaProperty fsMetaProperty = fsMetaType.Properties[i];
                if (fsMetaProperty.CanRead)
                {
                    fsData   value;
                    fsResult result = this.Serializer.TrySerialize(fsMetaProperty.StorageType, fsMetaProperty.OverrideConverterType, fsMetaProperty.Read(instance), out value);
                    success.AddMessages(result);
                    if (!result.Failed)
                    {
                        serialized.AsDictionary[fsMetaProperty.JsonName] = value;
                    }
                }
            }
            return(success);
        }
コード例 #12
0
        public override fsFailure TrySerialize(object instance, out fsData serialized, Type storageType)
        {
            serialized = fsData.CreateDictionary();

            fsMetaType metaType = fsMetaType.Get(instance.GetType());

            for (int i = 0; i < metaType.Properties.Length; ++i)
            {
                fsMetaProperty property = metaType.Properties[i];

                fsData serializedData;

                var failed = Serializer.TrySerialize(property.StorageType, property.Read(instance), out serializedData);
                if (failed.Failed)
                {
                    return(failed);
                }

                serialized.AsDictionary[property.Name] = serializedData;
            }

            return(fsFailure.Success);
        }
コード例 #13
0
        public override object CreateInstance(fsData data, Type storageType)
        {
            fsMetaType metaType = fsMetaType.Get(Serializer.Config, storageType);

            return(metaType.CreateInstance());
        }