Example #1
0
        private void InitSerializeFieldsDelegate(Type type)
        {
            Dictionary <string, MemberInfo> fields = HproseHelper.GetFields(type);
            DynamicMethod dynamicMethod            = new DynamicMethod("$SerializeFields",
                                                                       typeofVoid,
                                                                       typeofArgs,
                                                                       type,
                                                                       true);
            ILGenerator  gen   = dynamicMethod.GetILGenerator();
            LocalBuilder value = gen.DeclareLocal(typeofObject);
            LocalBuilder e     = gen.DeclareLocal(typeofException);

            foreach (KeyValuePair <string, MemberInfo> field in fields)
            {
                FieldInfo fieldInfo  = (FieldInfo)field.Value;
                Label     exTryCatch = gen.BeginExceptionBlock();
                if (type.IsValueType)
                {
                    gen.Emit(OpCodes.Ldarg_0);
                    gen.Emit(OpCodes.Unbox, type);
                }
                else
                {
                    gen.Emit(OpCodes.Ldarg_0);
                }
                gen.Emit(OpCodes.Ldfld, fieldInfo);
                if (fieldInfo.FieldType.IsValueType)
                {
                    gen.Emit(OpCodes.Box, fieldInfo.FieldType);
                }
                gen.Emit(OpCodes.Stloc_S, value);
                gen.Emit(OpCodes.Leave_S, exTryCatch);
                gen.BeginCatchBlock(typeofException);
                gen.Emit(OpCodes.Stloc_S, e);
                gen.Emit(OpCodes.Ldstr, "The field value can\'t be serialized.");
                gen.Emit(OpCodes.Ldloc_S, e);
                gen.Emit(OpCodes.Newobj, hproseExceptionCtor);
                gen.Emit(OpCodes.Throw);
                gen.Emit(OpCodes.Leave_S, exTryCatch);
                gen.EndExceptionBlock();
                gen.Emit(OpCodes.Ldarg_1);
                gen.Emit(OpCodes.Ldloc_S, value);
                gen.Emit(OpCodes.Call, serializeMethod);
            }
            gen.Emit(OpCodes.Ret);
            serializeFieldsDelegate = (SerializeDelegate)dynamicMethod.CreateDelegate(typeofSerializeDelegate);
        }
        protected override void InitUnserializeDelegate(Type type, string[] names, DynamicMethod dynamicMethod)
        {
            Dictionary <string, FieldTypeInfo> fields = HproseHelper.GetFields(type);
            ILGenerator  gen   = dynamicMethod.GetILGenerator();
            LocalBuilder e     = gen.DeclareLocal(typeofException);
            int          count = names.Length;

            for (int i = 0; i < count; ++i)
            {
                FieldTypeInfo field;
                if (fields.TryGetValue(names[i], out field))
                {
                    Label exTryCatch = gen.BeginExceptionBlock();
                    if (type.IsValueType)
                    {
                        gen.Emit(OpCodes.Ldarg_0);
                        gen.Emit(OpCodes.Unbox, type);
                    }
                    else
                    {
                        gen.Emit(OpCodes.Ldarg_0);
                    }
                    gen.Emit(OpCodes.Ldarg_1);
                    gen.Emit(OpCodes.Ldc_I4, i);
                    gen.Emit(OpCodes.Ldelem_Ref);
                    if (field.type.IsValueType)
                    {
                        gen.Emit(OpCodes.Unbox_Any, field.type);
                    }
                    gen.Emit(OpCodes.Stfld, field.info);
                    gen.Emit(OpCodes.Leave_S, exTryCatch);
                    gen.BeginCatchBlock(typeofException);
                    gen.Emit(OpCodes.Stloc_S, e);
                    gen.Emit(OpCodes.Ldstr, "The field value can\'t be unserialized.");
                    gen.Emit(OpCodes.Ldloc_S, e);
                    gen.Emit(OpCodes.Newobj, hproseExceptionCtor);
                    gen.Emit(OpCodes.Throw);
                    gen.Emit(OpCodes.Leave_S, exTryCatch);
                    gen.EndExceptionBlock();
                }
            }
            gen.Emit(OpCodes.Ret);
        }