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