/// <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; } } }
/// <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)); }
/// <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> 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) }); }