private Deserializer(Type t) : base(t) { bool canSerializeNull = CanSerializeNull; if (canSerializeNull) { Target target = DefineLabel(); Ldarg(0); Callvirt(ReadNull); Brfalse(target); bool isClass = T.IsClass; if (isClass) { Ldnull(); Ret(); } else { Ldarg(1); Initobj(T); Ret(); } MarkLabel(target); } bool isNullable = IsNullable; if (isNullable) { FieldInfo f = T.GetFieldPrivate("value"); SerializerInfo reader = GetReader(f.FieldType); EmitFieldDeserializer(reader, delegate { Ldarg(1); }, delegate { Ldflda(f); }, delegate { Stfld(f); }); Ldarg(1); Ldc(1); Stfld(T.GetFieldPrivate("hasValue")); Ret(); } else { bool isArray = T.IsArray; if (isArray) { var elementType = T.GetElementType(); SerializerInfo reader2 = GetReader(elementType); SerializerCall(ReadOpenArray); Local local = DeclareLocal <int>(false); Ldarg(0); Ldloca(local); Callvirt(ReadInt32); var target = DeclareLocal(T, false); Ldloc(local); Newarr(elementType); Stloc(target); using (IndexLoop loop = Loop(local)) { EmitFieldDeserializer(reader2 , LdTarget: () => { Ldloc(target); Ldloc(loop.Index); } , LdAddress: () => { Ldelema(elementType); } , StValue: () => { Stelem(ObjectReference); }); } SerializerCall(ReadCloseArray); Ldloc(target); Ret(); } else { bool isClass2 = T.IsClass; if (isClass2) { var target = DeclareLocal(T, false); Newobj(T); Stloc(target); SerializerCall(ReadOpenObject); FieldInfo[] fields = T.GetFields(); for (int i = 0; i < fields.Length; i++) { FieldInfo f3 = fields[i]; FieldInfo f = f3; SerializerInfo reader3 = GetReader(f.FieldType); SerializerInfo arg_36B_1 = reader3; EmitFieldDeserializer(arg_36B_1 , LdTarget: () => { Ldloc(target); } , LdAddress: () => { Ldflda(f); } , StValue: () => { Stfld(f); }); } SerializerCall(ReadCloseObject); Ldloc(target); Ret(); } else { SerializerCall(ReadOpenObject); FieldInfo[] fields2 = T.GetFields(); for (int j = 0; j < fields2.Length; j++) { FieldInfo f2 = fields2[j]; FieldInfo f = f2; SerializerInfo reader4 = GetReader(f.FieldType); EmitFieldDeserializer(reader4, delegate { Ldarg(1); }, delegate { Ldflda(f); }, delegate { Stfld(f); }); } SerializerCall(ReadCloseObject); Ret(); } } } }
private Serializer(Type t) : base(t) { bool canSerializeNull = CanSerializeNull; if (canSerializeNull) { bool isClass = T.IsClass; if (isClass) { Ldarg(1); } else { Ldarg(1); Ldfld(T.GetFieldPrivate("hasValue")); } Target target = DefineLabel(); Brtrue(target); Ldarg(0); Callvirt(WriteNull); Ret(); MarkLabel(target); } bool isNullable = IsNullable; if (isNullable) { FieldInfo f = T.GetFieldPrivate("value"); SerializerInfo writer = GetWriter(f.FieldType); EmitFieldSerializer(writer , LdTarget: () => Ldarg(1) , LdAddress: () => Ldflda(f) , LdValue: () => Ldfld(f) ); Ret(); } else { bool isArray = T.IsArray; if (isArray) { var elementType = T.GetElementType(); SerializerInfo writer2 = GetWriter(elementType); SerializerCall(WriteOpenArray); Local local = DeclareLocal(typeof(int), false); Ldarg(1); Ldlen(); Conv <int>(false, true); Stloc(local); Ldarg(0); Ldloca(local); Callvirt(WriteInt32); using (IndexLoop loop = Loop(local)) { this.EmitFieldSerializer(writer2 , LdTarget: () => { Ldarg(1); Ldloc(loop.Index); } , LdAddress: () => { Ldelema(elementType); } , LdValue: delegate { Ldelem(ObjectReference); }); } SerializerCall(WriteCloseArray); Ret(); } else { SerializerCall(WriteOpenObject); FieldInfo[] fields = T.GetFields(); for (int i = 0; i < fields.Length; i++) { FieldInfo f2 = fields[i]; FieldInfo f = f2; SerializerInfo writer3 = GetWriter(f.FieldType); EmitFieldSerializer(writer3, delegate { Ldarg(1); }, delegate { Ldflda(f); }, delegate { Ldfld(f); }); } SerializerCall(WriteCloseObject); Ret(); } } }