XmlSerializer缓存工厂

fuz*_*uzz 1 c# asp.net factory-pattern xmlserializer c#-4.0

遇到了一个工厂类,如果我想替换下面的XmlSerializer代码,我不完全确定如何使用它.

样本模型

public class SampleData
{
    public string Name { get; set; }
    public string Country { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现有守则

List<SampleData> objects = new List<SampleData>();
objects.Add(new SampleData() { Country = "Australia", Name = "aus" });

StringWriter writer = new StringWriter();

XmlSerializer serializer = new XmlSerializer(typeof(List<SampleData>));
serializer.Serialize(writer, objects);
Run Code Online (Sandbox Code Playgroud)

工厂类

public static class CachingXmlSerializerFactory
{
    private static readonly Dictionary<string, XmlSerializer> Cache = new Dictionary<string, XmlSerializer>();

    private static readonly object SyncRoot = new object();

    public static XmlSerializer Create(Type type, XmlRootAttribute root)
    {
        if (type == null) throw new ArgumentNullException("type");
        if (root == null) throw new ArgumentNullException("root");

        var key = String.Format(CultureInfo.InvariantCulture, "{0}:{1}", type, root.ElementName);

        lock (SyncRoot)
        {
            if (!Cache.ContainsKey(key))
            {
                Cache.Add(key, new XmlSerializer(type, root));
            }
        }

        return Cache[key];
    }

    public static XmlSerializer Create<T>(XmlRootAttribute root)
    {
        return Create(typeof(T), root);
    }

    public static XmlSerializer Create<T>()
    {
        return Create(typeof(T));
    }

    public static XmlSerializer Create<T>(string defaultNamespace)
    {
        return Create(typeof(T), defaultNamespace);
    }

    public static XmlSerializer Create(Type type)
    {
        return new XmlSerializer(type);
    }

    public static XmlSerializer Create(Type type, string defaultNamespace)
    {
        return new XmlSerializer(type, defaultNamespace);
    }
}
Run Code Online (Sandbox Code Playgroud)

luk*_*san 7

重读文章引用MSDN的部分.您已经在使用缓存内部序列化程序的两个构造函数之一,因此它不应导致内存泄漏.如果你使用的是其他构造函数之一,则需要担心缓存XmlSerializer,但事实并非如此.无需修复未破坏的东西.;-)