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;
+ }
+ }
}