static void EmitDeserializeValue(ILGenerator il, DeserializeInfo info) { var member = info.MemberInfo; var t = member.Type; if (MessagePackBinary.IsMessagePackPrimitive(t)) { il.EmitLdarg(1); il.EmitLdarg(2); il.EmitLdarg(4); if (t == typeof(byte[])) { il.EmitCall(MessagePackBinaryTypeInfo.ReadBytes); } else { il.EmitCall(MessagePackBinaryTypeInfo.TypeInfo.GetDeclaredMethod("Read" + t.Name)); } } else { il.EmitLdarg(3); il.EmitCall(getFormatterWithVerify.MakeGenericMethod(t)); il.EmitLdarg(1); il.EmitLdarg(2); il.EmitLdarg(3); il.EmitLdarg(4); il.EmitCall(getDeserialize(t)); } il.EmitStloc(info.LocalField); }
static void EmitSerializeValue(ILGenerator il, TypeInfo type, ObjectSerializationInfo.EmittableMember member) { var t = member.Type; if (MessagePackBinary.IsMessagePackPrimitive(t)) { EmitOffsetPlusEqual(il, null, () => { il.EmitLoadArg(type, 3); member.EmitLoadValue(il); if (t == typeof(byte[])) { il.EmitCall(MessagePackBinaryTypeInfo.WriteBytes); } else { il.EmitCall(MessagePackBinaryTypeInfo.TypeInfo.GetDeclaredMethod("Write" + t.Name)); } }); } else { EmitOffsetPlusEqual(il, () => { il.EmitLdarg(4); il.Emit(OpCodes.Call, getFormatterWithVerify.MakeGenericMethod(t)); }, () => { il.EmitLoadArg(type, 3); member.EmitLoadValue(il); il.EmitLdarg(4); il.EmitCall(getSerialize(t)); }); } }