diff --git a/dotnet/src/dotnetframework/GxClasses/Helpers/XMLHelper.cs b/dotnet/src/dotnetframework/GxClasses/Helpers/XMLHelper.cs index 6a98b2ecc..345fe3bb7 100644 --- a/dotnet/src/dotnetframework/GxClasses/Helpers/XMLHelper.cs +++ b/dotnet/src/dotnetframework/GxClasses/Helpers/XMLHelper.cs @@ -63,10 +63,10 @@ private GXXmlSerializer() { } public static T Deserialize(Type TargetType, string serialized, string sName, string sNameSpace, out List serializationErrors) { T deserialized; + GxSerializationErrorManager serErr = null; if (!string.IsNullOrEmpty(serialized)) { XmlSerializer xmls; - GxSerializationErrorManager serErr = new GxSerializationErrorManager(); if (string.IsNullOrEmpty(sNameSpace) && string.IsNullOrEmpty(sName)) { #pragma warning disable SCS0028 // Unsafe deserialization possible from {1} argument passed to '{0}' @@ -75,17 +75,13 @@ public static T Deserialize(Type TargetType, string serialized, string sName, } else { - xmls = GetSerializer(TargetType, null, sName, sNameSpace); - xmls.UnknownNode += serErr.unknownNode; + xmls = GetSerializer(TargetType, null, sName, sNameSpace, out serErr); } try { using (StringReader sr = new StringReader(serialized)) { - using (XmlReader xmlReader = XmlReader.Create(sr, new XmlReaderSettings {CheckCharacters=false })) - { - deserialized = (T)(xmls.Deserialize(xmlReader)); - } + deserialized = (T)(xmls.Deserialize(sr)); } } catch (InvalidOperationException ex) @@ -103,40 +99,53 @@ public static T Deserialize(Type TargetType, string serialized, string sName, throw ex; } } - finally + if (serErr != null) { - xmls.UnknownNode -= serErr.unknownNode; + serializationErrors = serErr.GetErrors(); + serErr.ClearErrors(); + } + else + { + serializationErrors = null; } - - serializationErrors = serErr.GetErrors(); return deserialized; } serializationErrors = new List(); return default(T); } private static ConcurrentDictionary serializers = new ConcurrentDictionary(); + private static ConcurrentDictionary serializersErr = new ConcurrentDictionary(); - private static XmlSerializer GetSerializer(Type type, XmlAttributeOverrides ovAttrs, string rootName, string sNameSpace) + private static XmlSerializer GetSerializer(Type type, XmlAttributeOverrides ovAttrs, string rootName, string sNameSpace, out GxSerializationErrorManager serErr) { string key = string.Format("{0},{1},{2},{3}", type.FullName, rootName, sNameSpace, ovAttrs == null); XmlRootAttribute root = new XmlRootAttribute(rootName); XmlSerializer serializer; if (serializers.TryGetValue(key, out serializer)) { + serializersErr.TryGetValue(key, out serErr); return serializer; } else { - return CreateSerializer(key, type, ovAttrs, root, sNameSpace); + return CreateSerializer(key, type, ovAttrs, root, sNameSpace, out serErr); } } - private static XmlSerializer CreateSerializer(string key, Type type, XmlAttributeOverrides ovAttrs, XmlRootAttribute root, string sNameSpace) + private static void XmlSerializer_UnknownNode(object sender, XmlNodeEventArgs e) + { + throw new NotImplementedException(); + } + + private static XmlSerializer CreateSerializer(string key, Type type, XmlAttributeOverrides ovAttrs, XmlRootAttribute root, string sNameSpace, out GxSerializationErrorManager serErr) { + serErr = new GxSerializationErrorManager(); #pragma warning disable SCS0028 // Unsafe deserialization possible from {1} argument passed to '{0}' - var s = new XmlSerializer(type, ovAttrs, Array.Empty(), root, sNameSpace); + XmlSerializer s = new XmlSerializer(type, ovAttrs, Array.Empty(), root, sNameSpace); #pragma warning restore SCS0028 // Unsafe deserialization possible from {1} argument passed to '{0}' + s.UnknownNode += serErr.unknownNode; serializers.TryAdd(key, s); + serializersErr.TryAdd(key, serErr); return s; } @@ -162,7 +171,7 @@ internal static string Serialize(string rootName, string sNameSpace, XmlAttribut { indentElements = xmlIndent.Trim().ToLower() == "true"; } - XmlSerializer xmls = GetSerializer(instance.GetType(), ovAttrs, rootName, sNameSpace); + XmlSerializer xmls = GetSerializer(instance.GetType(), ovAttrs, rootName, sNameSpace, out _); string s; using (MemoryStream stream = new MemoryStream()) { @@ -229,5 +238,6 @@ public List GetErrors() { return this.errors; } + internal void ClearErrors() { this.errors = new List();} } }