コード例 #1
0
        /// <summary>
        /// 真实类型
        /// </summary>
        /// <param name="deSerializer">二进制数据反序列化</param>
        /// <param name="value">数据对象</param>
        private static void realType(DeSerializer deSerializer, ref valueType value)
        {
            RemoteType remoteType = default(RemoteType);

            TypeDeSerializer <RemoteType> .StructDeSerialize(deSerializer, ref remoteType);

            if (deSerializer.State == DeSerializeState.Success)
            {
                Type type;
                if (remoteType.TryGet(out type))
                {
                    if (value == null || type.IsValueType)
                    {
                        value = (valueType)DeSerializeMethodCache.GetRealDeSerializer(type)(deSerializer, value);
                    }
                    else
                    {
                        DeSerializeMethodCache.GetRealDeSerializer(type)(deSerializer, value);
                    }
                }
                else
                {
                    deSerializer.State = DeSerializeState.RemoteTypeError;
                }
            }
        }
コード例 #2
0
        /// <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(DeSerializer.GetMemberDeSerializeMethod(fieldType) ?? DeSerializeMethodCache.GetMember(fieldType));
        }
コード例 #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);
        }
コード例 #4
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) });
 }