Skip to content
Merged
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
31 changes: 30 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 = [];

/// <summary>
/// Deserializes the specified XML document.
/// </summary>
Expand All @@ -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);
}

/// <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));

lock (XmlSerializers)
{
if (XmlSerializers.TryGetValue(type.TypeHandle, out var serializer))
{
return serializer;
}

serializer = new XmlSerializer(type);
XmlSerializers.Add(type.TypeHandle, serializer);

return serializer;
}
}
}
Loading