From f90fb582c70cbfbb8e844914809f1e982d4e72ef Mon Sep 17 00:00:00 2001 From: William Forney Date: Wed, 19 Aug 2026 09:08:44 -0700 Subject: [PATCH 1/2] fix(core): [B] cache XML serializers Avoid repeated XmlSerializer construction in XDocument deserialization. Assisted-by: OpenAI:GPT-5.6 Luna --- SharedCode.Core/Xml/XDocumentExtensions.cs | 36 +++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/SharedCode.Core/Xml/XDocumentExtensions.cs b/SharedCode.Core/Xml/XDocumentExtensions.cs index 27700ad..6dffbe3 100644 --- a/SharedCode.Core/Xml/XDocumentExtensions.cs +++ b/SharedCode.Core/Xml/XDocumentExtensions.cs @@ -8,6 +8,11 @@ namespace SharedCode.Xml; /// public static class XDocumentExtensions { + /// + /// Cached XML serializers by runtime type. + /// + private static readonly Dictionary XmlSerializers = []; + /// /// Deserializes the specified XML document. /// @@ -19,8 +24,37 @@ public static class XDocumentExtensions { _ = xmlDocument ?? throw new ArgumentNullException(nameof(xmlDocument)); - var xmlSerializer = new XmlSerializer(typeof(T)); + var xmlSerializer = GetXmlSerializer(typeof(T)); using var reader = xmlDocument.CreateReader(); return (T?)xmlSerializer.Deserialize(reader); } + + /// + /// Gets the XML serializer for the specified . + /// + /// The type handled by the serializer. + /// The for the . + /// type + private static XmlSerializer GetXmlSerializer(Type type) + { + _ = type ?? throw new ArgumentNullException(nameof(type)); + + if (XmlSerializers.TryGetValue(type.TypeHandle, out var serializer)) + { + return serializer; + } + + lock (XmlSerializers) + { + if (XmlSerializers.TryGetValue(type.TypeHandle, out serializer)) + { + return serializer; + } + + serializer = new XmlSerializer(type); + XmlSerializers.Add(type.TypeHandle, serializer); + } + + return serializer; + } } From 9b74898b3fb793450ba7c65be8e549f6b3d705e4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Aug 2026 03:02:03 +0000 Subject: [PATCH 2/2] fix(core): address XML serializer review feedback Co-authored-by: wforney <79032+wforney@users.noreply.github.com> --- SharedCode.Core/Xml/XDocumentExtensions.cs | 59 ++++++++++------------ 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/SharedCode.Core/Xml/XDocumentExtensions.cs b/SharedCode.Core/Xml/XDocumentExtensions.cs index 6dffbe3..b63b235 100644 --- a/SharedCode.Core/Xml/XDocumentExtensions.cs +++ b/SharedCode.Core/Xml/XDocumentExtensions.cs @@ -8,10 +8,10 @@ namespace SharedCode.Xml; /// public static class XDocumentExtensions { - /// - /// Cached XML serializers by runtime type. - /// - private static readonly Dictionary XmlSerializers = []; + /// + /// Cached XML serializers by runtime type. + /// + private static readonly Dictionary XmlSerializers = []; /// /// Deserializes the specified XML document. @@ -29,32 +29,27 @@ public static class XDocumentExtensions return (T?)xmlSerializer.Deserialize(reader); } - /// - /// Gets the XML serializer for the specified . - /// - /// The type handled by the serializer. - /// The for the . - /// type - private static XmlSerializer GetXmlSerializer(Type type) - { - _ = type ?? throw new ArgumentNullException(nameof(type)); - - if (XmlSerializers.TryGetValue(type.TypeHandle, out var serializer)) - { - return serializer; - } - - lock (XmlSerializers) - { - if (XmlSerializers.TryGetValue(type.TypeHandle, out serializer)) - { - return serializer; - } - - serializer = new XmlSerializer(type); - XmlSerializers.Add(type.TypeHandle, serializer); - } - - return serializer; - } + /// + /// Gets the XML serializer for the specified . + /// + /// The type handled by the serializer. + /// The for the . + /// type + private static XmlSerializer GetXmlSerializer(Type type) + { + _ = type ?? throw new ArgumentNullException(nameof(type)); + + lock (XmlSerializers) + { + if (XmlSerializers.TryGetValue(type.TypeHandle, out var serializer)) + { + return serializer; + } + + serializer = new XmlSerializer(type); + XmlSerializers.Add(type.TypeHandle, serializer); + + return serializer; + } + } }