Пример #1
0
        // 通过ab来设置值
        public void MergeFrom(ref object value, Nested.AnyBase ab)
        {
            if (ab.valueType == 0)
            {
                value = null;
                return;
            }

            var dic = (IDictionary)value;

            if (value == null)
            {
                value = System.Activator.CreateInstance(type);
                dic   = (IDictionary)value;
            }

            int cnt = ab.listCount;

            for (int i = 0; i < cnt; ++i)
            {
                if (ab.Get($"key:{i}", out var keyValue))
                {
                    object key = IL.Help.Create(keyType);
                    keyTypeSerialize.MergeFrom(ref key, keyValue);
                    if (ab.Get($"value:{i}", out var valueValue))
                    {
                        object kv = IL.Help.Create(valueType);
                        valueTypeSerialize.MergeFrom(ref kv, valueValue);

                        dic[key] = kv;
                    }
                    else
                    {
                        Debug.LogError($"dic {ab.dataKey} {i} value not find value!");
                    }
                }
                else
                {
                    Debug.LogError($"dic {ab.dataKey} {i} not find value!");
                }
            }
        }
Пример #2
0
        void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
        {
            byte flag = ab.valueType;

            if (flag == 0)
            {
                value = null;
                return;
            }

            if (value == null)
            {
                value = IL.Help.Create(type);
            }

            if (flag == 2)
            {
                return;
            }

            int            cnt = fieldInfos.Count;
            FieldInfo      field;
            ITypeSerialize its;

            for (int i = 0; i < cnt; ++i)
            {
                field = fieldInfos[i];
                if (ab.Get(field.Name, out var fieldValue))
                {
                    object cv = field.GetValue(value);
                    {
                        its = BinarySerializable.GetByFieldInfo(field);
                        if (fieldValue.typeFlags == its.typeFlag)
                        {
                            its.MergeFrom(ref cv, fieldValue);
                            if (its.typeFlag == TypeFlags.unityObjectType)
                            {
                                cv = UnityObjectSerialize.To((UnityEngine.Object)cv, field.FieldType);
                            }

                            field.SetValue(value, cv);
                        }
                    }
                }
            }
        }
Пример #3
0
        // 通过ab来设置值
        void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
        {
            byte flag = ab.valueType;

            if (flag == 0)
            {
                value = null;
                return;
            }

            bool isTypeTrue = ab.elementTypeFlags == elementTypeSerialize.typeFlag; // 类型是否一致
            var  array      = value as IList;
            int  length     = ab.listCount;

            if (isTypeTrue && (array == null || array.Count != length))
            {
                array = Create(length);
                value = array;
            }

            if (isTypeTrue)
            {
                for (int i = 0; i < length; ++i)
                {
                    object v = array[i];

                    ab.Get($"[{i}]", out var vv);
                    elementTypeSerialize.MergeFrom(ref v, vv);

                    try
                    {
                        array[i] = v;
                    }
                    catch (System.Exception /*ex*/)
                    {
                    }
                }
            }
        }