From 29cdaee9b67e1c8b9f1d5619fa99d0c001aa2ab5 Mon Sep 17 00:00:00 2001 From: Nick Martyshchenko Date: Sun, 4 Jun 2017 19:24:54 +0300 Subject: [PATCH 1/3] Fix Abstract properties are not Serialized and Deserialized and serialization got stuck in other case if remove IgnoreIndex attribute from abstract class #74 --- src/ZeroFormatter/Formatters/DynamicFormatter.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ZeroFormatter/Formatters/DynamicFormatter.cs b/src/ZeroFormatter/Formatters/DynamicFormatter.cs index cbea99d..c6fab1b 100644 --- a/src/ZeroFormatter/Formatters/DynamicFormatter.cs +++ b/src/ZeroFormatter/Formatters/DynamicFormatter.cs @@ -117,6 +117,9 @@ public static Tuple[] GetMembers(Type resolverType, Ty foundUnionKey = true; break; } + + if (propInfo.GetCustomAttributes(typeof(IgnoreFormatAttribute), true).Any()) break; + propInfo = null; var baseType = item.DeclaringType.GetTypeInfo().BaseType; From 270f804816f875c88e0fc23c3711d11399d8de4a Mon Sep 17 00:00:00 2001 From: Nick Martyshchenko Date: Sun, 4 Jun 2017 20:02:00 +0300 Subject: [PATCH 2/3] Fix stack imbalance after emitting and opcode used to create new ArraySegment --- src/ZeroFormatter/Formatters/DynamicFormatter.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ZeroFormatter/Formatters/DynamicFormatter.cs b/src/ZeroFormatter/Formatters/DynamicFormatter.cs index c6fab1b..21e7f23 100644 --- a/src/ZeroFormatter/Formatters/DynamicFormatter.cs +++ b/src/ZeroFormatter/Formatters/DynamicFormatter.cs @@ -405,16 +405,14 @@ static TypeInfo BuildFormatter(ModuleBuilder builder, Type resolverType, Type el { il.MarkLabel(labelA); - il.Emit(OpCodes.Ldloca_S, (byte)0); + il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldind_Ref); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_S, (byte)4); il.Emit(OpCodes.Ldind_I4); - il.Emit(OpCodes.Call, typeof(ArraySegment).GetTypeInfo().GetConstructor(new[] { typeof(byte[]), typeof(int), typeof(int) })); + il.Emit(OpCodes.Newobj, typeof(ArraySegment).GetTypeInfo().GetConstructor(new[] { typeof(byte[]), typeof(int), typeof(int) })); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldloc_0); var ti = typeof(DynamicObjectSegmentBuilder<,>).MakeGenericType(resolverType, elementType).GetTypeInfo().GetMethod("GetProxyType").Invoke(null, null) as TypeInfo; il.Emit(OpCodes.Newobj, ti.GetConstructor(new[] { typeof(DirtyTracker), typeof(ArraySegment) })); il.Emit(OpCodes.Ret); From 82eaa5c496a6a6d243b2f4ed7d34d74445c3fb4e Mon Sep 17 00:00:00 2001 From: Nick Martyshchenko Date: Sun, 4 Jun 2017 20:37:45 +0300 Subject: [PATCH 3/3] Fix inconsistent method naming used to concatenate string during creation of union exception error message --- src/ZeroFormatter/Formatters/DynamicFormatter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ZeroFormatter/Formatters/DynamicFormatter.cs b/src/ZeroFormatter/Formatters/DynamicFormatter.cs index 21e7f23..b3bebf8 100644 --- a/src/ZeroFormatter/Formatters/DynamicFormatter.cs +++ b/src/ZeroFormatter/Formatters/DynamicFormatter.cs @@ -937,7 +937,7 @@ static TypeInfo BuildFormatter(Type resolverType, Type buildType, PropertyInfo u il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Callvirt, typeof(Object).GetTypeInfo().GetMethod("GetType")); il.Emit(OpCodes.Callvirt, typeof(Type).GetTypeInfo().GetProperty("FullName").GetGetMethod()); - il.Emit(OpCodes.Call, typeof(string).GetTypeInfo().GetMethods().First(x => x.GetParameters().Length == 2 && x.GetParameters().All(y => y.ParameterType == typeof(string)))); + il.Emit(OpCodes.Call, typeof(string).GetTypeInfo().GetMethod("Concat", new[] {typeof(string), typeof(string)})); il.Emit(OpCodes.Newobj, typeof(Exception).GetTypeInfo().GetConstructors().First(x => x.GetParameters().Length == 1)); il.Emit(OpCodes.Throw); }