Exemple #1
0
        // 把值写入到ab当中
        public void WriteTo(object value, Nested.AnyBase ab)
        {
            if (value == null)
            {
                ab.valueType = 0;
                return;
            }

            var cnt = fieldInfos.Count;

            ab.valueType = cnt == 0 ? (byte)2 : (byte)1;
            if (cnt == 0)
            {
                return;
            }

            ITypeSerialize its;

            for (int i = 0; i < cnt; ++i)
            {
                var    field = fieldInfos[i];
                object cv    = field.GetValue(value);

                its = BinarySerializable.GetByFieldInfo(field);
                its.WriteTo(cv, ab.Create(field.Name, its.typeFlag));
            }
        }
        void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
        {
            string fullName = ab.typeName;

            if (string.IsNullOrEmpty(fullName))
            {
                value = null;
                return;
            }

            RefType refType = (RefType)value;

            if (refType == null || refType.Instance == null)
            {
                refType = new RefType(fullName);
                value   = refType;
            }
            else
            {
                var type = IL.Help.GetInstanceType(refType.Instance);
                if (type.FullName != fullName)
                {
                    refType.SetInstance(IL.Help.CreateInstaince(type, null));
                }
            }

            var instance = refType.Instance;

            BinarySerializable.GetByInstance(instance).MergeFrom(ref instance, ab);
            refType.SetInstance(instance);
        }
Exemple #3
0
 // value = this
 public void CopyTo(AnyBase value)
 {
     value.dataKey          = dataKey;
     value.typeName         = typeName;
     value.valueType        = valueType;
     value.typeFlags        = typeFlags;
     value.baseValue        = baseValue;
     value.unityObj         = unityObj;
     value.listCount        = listCount;
     value.elementTypeFlags = elementTypeFlags;
 }
Exemple #4
0
        // 把值写入到ab当中
        void ITypeSerialize.WriteTo(object value, Nested.AnyBase ab)
        {
            RefType refType = (RefType)value;

            if (refType == null || refType.Instance == null)
            {
                return;
            }

            typeSerialize.WriteTo(refType.Instance, ab);
        }
        // 把值写入到ab当中
        public void WriteTo(object value, Nested.AnyBase ab)
        {
            RefType refType = (RefType)value;

            if (refType == null || refType.Instance == null)
            {
                ab.typeName = string.Empty;
                return;
            }

            var type = IL.Help.GetInstanceType(value);

            ab.typeName = type.FullName;
            BinarySerializable.GetByType(type).WriteTo(value, ab);
        }
Exemple #6
0
        // 通过ab来设置值
        void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
        {
            RefType refType = (RefType)value;

            if (refType == null)
            {
                refType = new RefType(type);
                value   = refType;
            }

            var instance = refType.Instance;

            typeSerialize.MergeFrom(ref instance, ab);
            refType.SetInstance(instance);
        }
Exemple #7
0
        public override bool Get(string key, out AnyBase ab)
        {
            int cnt = fields.Count;

            for (int i = 0; i < cnt; ++i)
            {
                if (fields[i].dataKey == key)
                {
                    ab = fields[i];
                    return(true);
                }
            }

            ab = null;
            return(false);
        }
Exemple #8
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);
                        }
                    }
                }
            }
        }
Exemple #9
0
        protected static void Blend(AnyBase now, AnyBase old)
        {
            if (old == null)
            {
                return;
            }

            var newFields = now.items;
            var oldFields = old.items;
            int nowCnt    = newFields.Count;
            int oldCnt    = oldFields.Count;

            Dictionary <string, AnyBase> keyToIndexs = new Dictionary <string, AnyBase>();

            for (int i = 0; i < nowCnt; ++i)
            {
                keyToIndexs.Add(newFields[i].dataKey, newFields[i]);
            }

            List <AnyBase> news = new List <AnyBase>();

            for (int i = 0; i < oldCnt; ++i)
            {
                var od = oldFields[i];
                if (keyToIndexs.TryGetValue(od.dataKey, out var v))
                {
                    // 新值与老值,都有值
                    news.Add(v);
                    Blend(v, od);
                    keyToIndexs.Remove(od.dataKey);
                }
                else
                {
                    // 新的没有值,旧的有值,保留旧的
                    news.Add(od);
                }
            }

            foreach (var ator in keyToIndexs)
            {
                news.Add(ator.Value);
            }

            now.items = news;
        }
Exemple #10
0
        public static void MergeFrom(object obj, Nested.AnyBase ab)
        {
            var its = GetByInstance(obj);

            if (its == null)
            {
                return;
            }

            try
            {
                its.MergeFrom(ref obj, ab);
            }
            catch (System.Exception ex)
            {
                UnityEngine.Debug.LogException(ex);
            }
        }
Exemple #11
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!");
                }
            }
        }
Exemple #12
0
        // 把值写入到ab当中
        public void WriteTo(object value, Nested.AnyBase ab)
        {
            if (value == null)
            {
                ab.valueType = 0;
                return;
            }

            ab.valueType = 1;
            var dic = (IDictionary)value;
            int cnt = 0;

            ab.listCount = dic.Count;
            foreach (DictionaryEntry ator in dic)
            {
                string key = cnt.ToString();
                keyTypeSerialize.WriteTo(ator.Key, ab.Create($"key:{key}", keyTypeSerialize.typeFlag));
                valueTypeSerialize.WriteTo(ator.Value, ab.Create($"value:{key}", valueTypeSerialize.typeFlag));
                ++cnt;
            }
        }
Exemple #13
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*/)
                    {
                    }
                }
            }
        }
Exemple #14
0
        // 把值写入到ab当中
        void ITypeSerialize.WriteTo(object value, Nested.AnyBase ab)
        {
            IList array = (IList)value;

            if (array == null)
            {
                ab.valueType = 0;
                return;
            }

            ab.valueType        = 1;
            ab.elementTypeFlags = elementTypeSerialize.typeFlag;
            object elementObj;
            int    cnt = array.Count;

            ab.listCount = cnt;
            for (int i = 0; i < cnt; ++i)
            {
                elementObj = array[i];
                var cts = ab.Create($"[{i}]", elementTypeSerialize.typeFlag);
                elementTypeSerialize.WriteTo(elementObj, cts);
            }
        }
Exemple #15
0
 void ITypeSerialize.WriteTo(object value, Nested.AnyBase ab)
 {
     ab.baseValue = writeToS((T)value);
 }
Exemple #16
0
 public static void Blend(Any0 now, Any0 old)
 {
     AnyBase.Blend(now, old);
 }
Exemple #17
0
 // 通过ab来设置值
 void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
 {
     SetObject(ref value, ab.unityObj);
 }
Exemple #18
0
 // 把值写入到ab当中
 void ITypeSerialize.WriteTo(object value, Nested.AnyBase ab)
 {
     ab.unityObj = GetUnityObject(type, value);
 }
 void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
 {
     value = int.Parse(ab.baseValue);
 }
 // 把值写入到ab当中
 void ITypeSerialize.WriteTo(object value, Nested.AnyBase ab)
 {
     ab.baseValue = ((int)value).ToString();
 }
Exemple #21
0
 public override bool Get(string key, out AnyBase ab)
 {
     throw new System.Exception("AnyEnd.Get");
 }
Exemple #22
0
 public abstract bool Get(string key, out AnyBase ab);
 // 通过ab来设置值
 void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
 {
     value = Str2Enum.To(ab.baseValue, enumType);
 }
 // 把值写入到ab当中
 void ITypeSerialize.WriteTo(object value, Nested.AnyBase ab)
 {
     ab.baseValue = Str2Enum.GetEnumStr(value, enumType);
 }
Exemple #25
0
 public static void MergeFrom(object obj, Nested.AnyBase ab)
 {
     BinarySerializable.MergeFrom(obj, ab);
 }
Exemple #26
0
 void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab)
 {
     value = System.Enum.ToObject(enumType, int.Parse(ab.baseValue));
 }