/// <summary>
        /// 创建二进制数据反序列化
        /// </summary>
        /// <param name="attribute"></param>
        /// <returns></returns>
        internal TypeDeSerializer <valueType> CreateOnly(BinarySerializeAttribute attribute)
        {
            DeSerializeVersionField[] fieldArray = this.fields;
            LeftArray <FieldSize>     fixedFields = new LeftArray <FieldSize>(fieldArray.Length - noSerializeMemberCount), fields = new LeftArray <FieldSize>(fieldArray.Length - noSerializeMemberCount);
            LeftArray <AutoCSer.Metadata.FieldIndex> jsonFields = new LeftArray <AutoCSer.Metadata.FieldIndex>(0);
            int fixedSize = 0;

            AutoCSer.Algorithm.QuickSort.Sort(fieldArray, DeSerializeVersionField.MemberNameSort, 0, fieldArray.Length);
            if (attribute.GetIsMemberMap)
            {
                int memberIndex = 0;
                LeftArray <DeSerializeVersionField> newFields = new LeftArray <DeSerializeVersionField>(fieldArray.Length);
                foreach (DeSerializeVersionField field in fieldArray)
                {
                    if (field.Attribute != null)
                    {
                        if (field.Field.MemberIndex == memberIndex)
                        {
                            newFields.Add(field);
                        }
                        else
                        {
                            newFields.Add(field.Copy(memberIndex));
                        }
                    }
                    ++memberIndex;
                }
                fieldArray = newFields.ToArray();
            }
            else if (noSerializeMemberCount != 0)
            {
                fieldArray = fieldArray.getFindArray(value => value.Attribute != null);
            }
            foreach (DeSerializeVersionField field in fieldArray)
            {
                BinarySerializeMemberAttribute memberAttribute = field.Attribute;
                if (memberAttribute.GetIsJson)
                {
                    jsonFields.Add(field.Field);
                }
                else
                {
                    FieldSize value = new FieldSize(field.Field);
                    if (value.FixedSize == 0)
                    {
                        fields.Add(value);
                    }
                    else
                    {
                        fixedFields.Add(value);
                        fixedSize += value.FixedSize;
                    }
                }
            }
            int memberCountVerify;
            Fields <FieldSize> fieldSizes = new Fields <FieldSize>(ref fixedFields, ref fields, ref jsonFields, fixedSize, attribute.GetIsJson, out memberCountVerify);

            return(DeSerializer = new TypeDeSerializer <valueType>(GlobalVersion, ref fieldSizes, memberCountVerify));
        }
Esempio n. 2
0
 /// <summary>
 /// 添加字段
 /// </summary>
 /// <param name="field">字段信息</param>
 public void Push(FieldSize field)
 {
     generator.Emit(OpCodes.Ldarg_0);
     if (isValueType)
     {
         generator.Emit(OpCodes.Ldarga_S, 1);
     }
     else
     {
         generator.Emit(OpCodes.Ldarg_1);
     }
     generator.Emit(OpCodes.Ldfld, field.Field);
     generator.call(BinarySerializer.GetMemberSerializeMethod(field.Field.FieldType) ?? SerializeMethodCache.GetMember(field.Field.FieldType));
 }
Esempio n. 3
0
        /// <summary>
        /// 添加字段
        /// </summary>
        /// <param name="field">字段信息</param>
        public void Push(FieldSize field)
        {
            Label end = generator.DefineLabel();

            generator.memberMapIsMember(OpCodes.Ldarg_0, field.MemberIndex);
            generator.Emit(OpCodes.Brfalse_S, end);

            generator.Emit(OpCodes.Ldarg_1);
            generator.Emit(OpCodes.Ldarg_2);
            if (!isValueType)
            {
                generator.Emit(OpCodes.Ldind_Ref);
            }
            generator.Emit(OpCodes.Ldflda, field.Field);
            generator.call(BinaryDeSerializer.GetMemberMapDeSerializeMethod(field.Field.FieldType) ?? DeSerializeMethodCache.GetMember(field.Field.FieldType));

            generator.MarkLabel(end);
        }
        /// <summary>
        /// 添加字段
        /// </summary>
        /// <param name="field">字段信息</param>
        public void Push(FieldSize field)
        {
            Type fieldType = field.Field.FieldType;

            generator.Emit(OpCodes.Ldarg_0);
            if (field.Field.IsStatic)
            {
                LocalBuilder staticMember = generator.DeclareLocal(fieldType);
                generator.initobj(fieldType, staticMember);
                generator.Emit(OpCodes.Ldloca, staticMember);
            }
            else
            {
                generator.Emit(OpCodes.Ldarg_1);
                if (!isValueType)
                {
                    generator.Emit(OpCodes.Ldind_Ref);
                }
                generator.Emit(OpCodes.Ldflda, field.Field);
            }
            generator.call(BinaryDeSerializer.GetMemberDeSerializeMethod(fieldType) ?? DeSerializeMethodCache.GetMember(fieldType));
        }
Esempio n. 5
0
        /// <summary>
        /// 获取字段成员集合
        /// </summary>
        /// <param name="fieldIndexs"></param>
        /// <param name="isJson"></param>
        /// <param name="memberCountVerify"></param>
        /// <returns>字段成员集合</returns>
        public static Fields <FieldSize> GetFields(FieldIndex[] fieldIndexs, bool isJson, out int memberCountVerify)
        {
            LeftArray <FieldSize>  fixedFields = new LeftArray <FieldSize>(fieldIndexs.Length), fields = new LeftArray <FieldSize>(fieldIndexs.Length);
            LeftArray <FieldIndex> jsonFields = new LeftArray <FieldIndex>();
            int fixedSize = 0;

            foreach (FieldIndex field in fieldIndexs)
            {
                Type fieldType = field.Member.FieldType;
                if (!fieldType.IsPointer && (!fieldType.IsArray || fieldType.GetArrayRank() == 1) && !field.IsIgnore && !typeof(Delegate).IsAssignableFrom(fieldType))
                {
                    SerializeMemberAttribute memberAttribute = field.GetAttribute <SerializeMemberAttribute>(true);
                    if (memberAttribute == null || (memberAttribute.IsSetup && !memberAttribute.IsRemove))
                    {
                        if (memberAttribute != null && memberAttribute.GetIsJson)
                        {
                            jsonFields.Add(field);
                        }
                        else
                        {
                            FieldSize value = new FieldSize(field);
                            if (value.FixedSize == 0)
                            {
                                fields.Add(value);
                            }
                            else
                            {
                                fixedFields.Add(value);
                                fixedSize += value.FixedSize;
                            }
                        }
                    }
                }
            }
            return(new Fields <FieldSize>(ref fixedFields, ref fields, ref jsonFields, fixedSize, isJson, out memberCountVerify));
        }
Esempio n. 6
0
 /// <summary>
 /// 固定分组排序字节数排序比较
 /// </summary>
 /// <param name="left"></param>
 /// <param name="right"></param>
 /// <returns></returns>
 internal static int FixedSizeSort(FieldSize left, FieldSize right)
 {
     return((int)((uint)right.FixedSize & (0U - (uint)right.FixedSize)) - (int)((uint)left.FixedSize & (0U - (uint)left.FixedSize)));
 }
Esempio n. 7
0
 /// <summary>
 /// 设置字段信息
 /// </summary>
 /// <param name="field"></param>
 internal void Set(FieldSize field)
 {
     Field           = field.Field;
     MemberIndex     = field.MemberIndex;
     SerializeMethod = (Action <Serializer, object>) typeof(AutoCSer.Reflection.InvokeMethod <,>).MakeGenericType(typeof(Serializer), Field.FieldType).GetMethod("getTypeObject", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { Serializer.GetMemberMapSerializeMethod(Field.FieldType) ?? SerializeMethodCache.GetMember(Field.FieldType) });
 }
Esempio n. 8
0
 /// <summary>
 /// 设置字段信息
 /// </summary>
 /// <param name="field"></param>
 internal void Set(FieldSize field)
 {
     Field             = field.Field;
     MemberIndex       = field.MemberIndex;
     DeSerializeMethod = (Func <DeSerializer, object, object>) typeof(AutoCSer.Reflection.InvokeMethodRef2 <,>).MakeGenericType(typeof(DeSerializer), Field.FieldType).GetMethod("getTypeObjectReturn", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { DeSerializer.GetMemberDeSerializeMethod(Field.FieldType) ?? DeSerializeMethodCache.GetMember(Field.FieldType) });
 }