Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion SharedCode.Core/Xml/XDocumentExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ namespace SharedCode.Xml;
/// </summary>
public static class XDocumentExtensions
{
/// <summary>
/// Cached XML serializers by runtime type.
/// </summary>
private static readonly Dictionary<RuntimeTypeHandle, XmlSerializer> XmlSerializers = [];

Comment on lines +11 to +15
/// <summary>
/// Deserializes the specified XML document.
/// </summary>
Expand All @@ -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);
}

/// <summary>
/// Gets the XML serializer for the specified <paramref name="type" />.
/// </summary>
/// <param name="type">The type handled by the serializer.</param>
/// <returns>The <see cref="XmlSerializer" /> for the <paramref name="type" />.</returns>
/// <exception cref="ArgumentNullException">type</exception>
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;
Comment on lines +42 to +58
}
}
Loading