From 699c7343895b8173f81926897aff0993d2a1fd4a Mon Sep 17 00:00:00 2001 From: Chris Cameron Date: Wed, 17 Oct 2018 16:56:36 -0400 Subject: [PATCH] feat: DefaultXmlConverter knows type it is serializing to/from --- ICD.Common.Utils/Xml/DefaultXmlConverter.cs | 42 ++++++++++++++++++- ICD.Common.Utils/Xml/XmlConverterAttribute.cs | 6 +-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/ICD.Common.Utils/Xml/DefaultXmlConverter.cs b/ICD.Common.Utils/Xml/DefaultXmlConverter.cs index da72eea..7bdb5dc 100644 --- a/ICD.Common.Utils/Xml/DefaultXmlConverter.cs +++ b/ICD.Common.Utils/Xml/DefaultXmlConverter.cs @@ -1,9 +1,31 @@ using System; +using System.Collections.Generic; namespace ICD.Common.Utils.Xml { - public sealed class DefaultXmlConverter : AbstractXmlConverter + public sealed class DefaultXmlConverter : AbstractXmlConverter { + private static readonly Dictionary s_Instances; + + private readonly Type m_SerializeType; + + /// + /// Static constructor. + /// + static DefaultXmlConverter() + { + s_Instances = new Dictionary(); + } + + /// + /// Constructor. + /// + /// + private DefaultXmlConverter(Type serializeType) + { + m_SerializeType = serializeType; + } + /// /// Writes the XML representation of the object. /// @@ -28,5 +50,23 @@ namespace ICD.Common.Utils.Xml { throw new NotSupportedException(); } + + /// + /// Gets the converter instance for the given serialization type. + /// + /// + /// + public static IXmlConverter Instance(Type type) + { + DefaultXmlConverter converter; + + if (!s_Instances.TryGetValue(type, out converter)) + { + converter = new DefaultXmlConverter(type); + s_Instances[type] = converter; + } + + return converter; + } } } diff --git a/ICD.Common.Utils/Xml/XmlConverterAttribute.cs b/ICD.Common.Utils/Xml/XmlConverterAttribute.cs index af24969..afb97de 100644 --- a/ICD.Common.Utils/Xml/XmlConverterAttribute.cs +++ b/ICD.Common.Utils/Xml/XmlConverterAttribute.cs @@ -42,7 +42,7 @@ namespace ICD.Common.Utils.Xml /// public static IXmlConverter GetConverterForInstance(object value) { - return value == null ? LazyLoadConverter(typeof(DefaultXmlConverter)) : GetConverterForType(value.GetType()); + return value == null ? DefaultXmlConverter.Instance(typeof(object)) : GetConverterForType(value.GetType()); } /// @@ -59,9 +59,9 @@ namespace ICD.Common.Utils.Xml if (!s_InstanceTypeToConverter.TryGetValue(type, out converter)) { XmlConverterAttribute attribute = AttributeUtils.GetClassAttribute(type); - Type converterType = attribute == null ? typeof(DefaultXmlConverter) : attribute.ConverterType; + Type converterType = attribute == null ? null : attribute.ConverterType; - converter = LazyLoadConverter(converterType); + converter = converterType == null ? DefaultXmlConverter.Instance(type) : LazyLoadConverter(converterType); s_InstanceTypeToConverter[type] = converter; }