예제 #1
0
        public override void GenerateSerializeIL(MethodGenerator g)
        {
            g.If(() =>
            {
                LoadMemberValue(g);//加载集合到堆栈上,检查是否为null
                return(LogicOperator.IsNull);
            }, () =>
            {
                SerializationMethodHelper.WriteArray(g, this.DTOMemberName);
            }, () =>
            {
                var elementType = this.TargetType.ResolveElementType();
                ////写入数组
                SerializationMethodHelper.WriteArray(g, this.DTOMemberName);

                //写入每个项
                LoadMemberValue(g);
                g.ForEach(item =>
                {
                    SerializationMethodHelper.WriteElement(g, this.DTOMemberName, elementType, () =>
                    {
                        g.Load(item);
                    });
                });
            });
        }
 /// <summary>
 /// 生成反序列化代码
 /// </summary>
 /// <param name="g"></param>
 public virtual void GenerateDeserializeIL(MethodGenerator g)
 {
     SetMember(g, () =>
     {
         SerializationMethodHelper.Read(g, this.DTOMemberName, this.TargetType);
     });
 }
예제 #3
0
 /// <summary>
 /// 生成序列化代码
 /// </summary>
 /// <param name="g"></param>
 public virtual void GenerateSerializeIL(MethodGenerator g)
 {
     //serializer.serialize(v); 或 //writer.Writer(v);
     SerializationMethodHelper.Write(g, this.DTOMemberName, this.TargetType, () =>
     {
         LoadMemberValue(g);
     });
 }
예제 #4
0
        public override void GenerateDeserializeIL(MethodGenerator g)
        {
            SetMember(g, () =>
            {
                var count = g.Declare <int>();
                g.Assign(count, () =>
                {
                    SerializationMethodHelper.ReadLength(g, this.DTOMemberName);//读取数量
                });

                var list = g.Declare(this.TargetType);

                g.If(() =>
                {
                    g.Load(count);
                    g.Load(0);
                    return(LogicOperator.LessThan);
                }, () =>
                {
                    //数量小于1
                    //list = new List<T>();
                    var elementType = this.TargetType.ResolveElementType();
                    g.Assign(list, () =>
                    {
                        g.NewObject(this.TargetType);
                    });
                }, () =>
                {
                    //list = new List<T>();
                    g.Assign(list, () =>
                    {
                        g.NewObject(this.TargetType);
                    });

                    var elementType = this.TargetType.ResolveElementType();

                    g.For(count, (index) =>
                    {
                        var item = g.Declare(elementType);

                        g.Assign(item, () =>
                        {
                            SerializationMethodHelper.ReadElement(g, this.DTOMemberName, elementType, index);
                        });

                        g.Load(list);
                        g.Load(item);
                        g.Call(this.TargetType.ResolveMethod("Add", elementType));
                    });
                });

                g.Load(list);
            });
        }
 /// <summary>
 /// 生成序列化代码
 /// </summary>
 /// <param name="g"></param>
 public virtual void GenerateSerializeIL(MethodGenerator g)
 {
     //serializer.serialize(v); 或 //writer.Writer(v);
     SerializationMethodHelper.Write(g, this.DTOMemberName, this.TargetType, (argType) =>
     {
         LoadMemberValue(g);
         //TargetType是成员(也就是属性或者字段)的类型
         //argType是方法需要接受到的类型,如果两者类型不匹配,就需要转换
         if (this.TargetType.IsStruct() && !argType.IsStruct())
         {
             g.Box();
         }
     });
 }
        /// <summary>
        /// <para>得到读取某个类型的IL代码</para>
        /// <para>reader.ReadXXX(); 或 deserialzer.Deserialze();</para>
        /// </summary>
        /// <param name="g"></param>
        /// <param name="valueType"></param>
        /// <param name="loadValue"></param>
        public static void Read(MethodGenerator g, string dtoMemberName, Type valueType)
        {
            var method   = SerializationMethodHelper.GetTypeMethod(valueType, SerializationMethodType.Deserialize);
            var prmIndex = SerializationMethodHelper.GetParameterIndex(method, SerializationMethodType.Deserialize);

            g.Call(method, () =>
            {
                g.LoadParameter(prmIndex);
                g.Load(dtoMemberName);
                //if (prmIndex == SerializationArgs.DeserializerIndex)
                //{
                //    //是deserializer.Deserializ();
                //    g.LoadVariable(SerializationArgs.TypeNameTable);
                //}
            });
        }
예제 #7
0
 protected void Initialize()
 {
     if (this.ClassAttribute != null)
     {
         return;                              //已初始化
     }
     this.ClassAttribute = GetClassAttribute(this.ClassType);
     if (SerializationMethodHelper.IsPrimitive(this.ClassType) || this.ClassType == typeof(DTObject))
     {
         //this.DTOSchemaCode = string.Empty;
     }
     else
     {
         _memberInfos      = BuildMembers();
         SerializeMethod   = CreateSerializeMethod();
         DeserializeMethod = CreateDeserializeMethod();
         // this.DTOSchemaCode = "{}";
     }
 }
        /// <summary>
        /// <para>得到写入某个类型的IL代码</para>
        /// <para>writer.Write(value); 或 serialzer.Serialze(value);</para>
        /// </summary>
        /// <param name="g"></param>
        /// <param name="valueType"></param>
        /// <param name="loadValue"></param>
        public static void Write(MethodGenerator g, string dtoMemberName, Type valueType, Action <Type> loadValue)
        {
            var method   = SerializationMethodHelper.GetTypeMethod(valueType, SerializationMethodType.Serialize);
            var prmIndex = SerializationMethodHelper.GetParameterIndex(method, SerializationMethodType.Serialize);

            g.Call(method, () =>
            {
                g.LoadParameter(prmIndex);
                g.Load(dtoMemberName);
                var argType = method.GetParameters()[1].ParameterType;
                loadValue(argType);



                //if (prmIndex == SerializationArgs.SerializerIndex)
                //{
                //    //是serializer.Serializ();
                //    g.LoadVariable(SerializationArgs.TypeNameTable);
                //}
            });
        }
예제 #9
0
        public override void GenerateDeserializeIL(MethodGenerator g)
        {
            SetMember(g, () =>
            {
                var array = g.Declare(this.TargetType);

                if (this.MemberAttribute.IsBlob)
                {
                    g.Assign(array, () =>
                    {
                        SerializationMethodHelper.ReadBlob(g, this.DTOMemberName);//读取数量
                    });
                }
                else
                {
                    var length = g.Declare <int>();
                    g.Assign(length, () =>
                    {
                        SerializationMethodHelper.ReadLength(g, this.DTOMemberName);//读取数量
                    });

                    g.If(() =>
                    {
                        g.Load(length);
                        g.Load(0);
                        return(LogicOperator.LessThan);
                    }, () =>
                    {
                        //数量小于1
                        //array = new array[];
                        var elementType = this.TargetType.ResolveElementType();
                        g.Assign(array, () =>
                        {
                            g.NewArray(elementType, () =>
                            {
                                g.Load(length);
                            });
                        });
                    }, () =>
                    {
                        var elementType = this.TargetType.ResolveElementType();

                        //int[] = new int[c];
                        g.Assign(array, () =>
                        {
                            g.NewArray(elementType, () =>
                            {
                                g.Load(length);
                            });
                        });

                        g.For(length, (index) =>
                        {
                            var item = g.Declare(elementType);

                            g.Assign(item, () =>
                            {
                                SerializationMethodHelper.ReadElement(g, this.DTOMemberName, elementType, index);
                            });

                            g.StoreElement(array, index, item);
                        });
                    });
                }

                g.Load(array);
            });
        }