diff --git a/SharedCode.Core/Xml/XDocumentExtensions.cs b/SharedCode.Core/Xml/XDocumentExtensions.cs index 27700ad..b63b235 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,32 @@ 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)); + + lock (XmlSerializers) + { + if (XmlSerializers.TryGetValue(type.TypeHandle, out var serializer)) + { + return serializer; + } + + serializer = new XmlSerializer(type); + XmlSerializers.Add(type.TypeHandle, serializer); + + return serializer; + } + } }