C# XmlSerializer缓存工厂

C# XmlSerializer缓存工厂,c#,asp.net,c#-4.0,factory-pattern,xmlserializer,C#,Asp.net,C# 4.0,Factory Pattern,Xmlserializer,如果我想替换下面的XmlSerializer代码,我和我不完全确定如何使用它 样本模型 public class SampleData { public string Name { get; set; } public string Country { get; set; } } 现有代码 List<SampleData> objects = new List<SampleData>(); objects.Add(new SampleData() { C

如果我想替换下面的
XmlSerializer
代码,我和我不完全确定如何使用它

样本模型

public class SampleData
{
    public string Name { get; set; }
    public string Country { get; set; }
}
现有代码

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);
List objects=newlist();
添加(新的SampleData(){Country=“Australia”,Name=“aus”});
StringWriter编写器=新的StringWriter();
XmlSerializer serializer=新的XmlSerializer(typeof(List));
序列化器。序列化(编写器、对象);
工厂级

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);
    }
}
公共静态类CachingXmlSerializerFactory
{
私有静态只读字典缓存=新建字典();
私有静态只读对象SyncRoot=新对象();
公共静态XmlSerializer创建(类型类型,XmlRootAttribute根)
{
如果(type==null)抛出新的ArgumentNullException(“type”);
如果(root==null)抛出新的ArgumentNullException(“root”);
var key=String.Format(CultureInfo.InvariantCulture,“{0}:{1}”,类型,root.ElementName);
锁定(同步根)
{
如果(!Cache.ContainsKey(键))
{
Add(key,新的XmlSerializer(type,root));
}
}
返回缓存[键];
}
公共静态XmlSerializer创建(XmlRootAttribute根)
{
返回Create(typeof(T),root);
}
公共静态XmlSerializer Create()
{
返回创建(typeof(T));
}
公共静态XmlSerializer创建(字符串defaultNamespace)
{
返回Create(typeof(T),defaultNamespace);
}
公共静态XmlSerializer创建(类型)
{
返回新的XmlSerializer(类型);
}
公共静态XmlSerializer创建(类型,字符串defaultNamespace)
{
返回新的XmlSerializer(类型,defaultNamespace);
}
}

重新阅读文章引用自MSDN的部分。您已经在使用缓存内部序列化程序的两个构造函数之一,因此不会导致内存泄漏。如果使用的是其他构造函数之一,则需要担心如何缓存
XmlSerializer
,但实际上并非如此。无需修复未损坏的部件。;-)

重新阅读文章引用自MSDN的部分。您已经在使用缓存内部序列化程序的两个构造函数之一,因此不会导致内存泄漏。如果使用的是其他构造函数之一,则需要担心如何缓存
XmlSerializer
,但实际上并非如此。无需修复未损坏的部件。;-)

IIRC,
XmlSerializer
已经在内部执行基于类型的缓存,因此一遍又一遍地为同一类型实例化新的缓存非常快。您希望通过这样做获得可衡量的绩效收益吗?编辑:那么您在尝试时遇到的具体问题是什么?“试图使用以下内容但没有任何效果”并没有太大帮助。啊,对我关于性能的评论不予理睬;这是关于内存泄漏的(尽管在我使用
XmlSerializer
的经验中,我没有内存问题)@ChrisSinclair为了提高性能,XML序列化基础结构动态生成程序集来序列化和反序列化指定的类型。基础结构查找并重用这些程序集。-我没有意识到它在内部执行基于类型的缓存。我所追求的是限制可能发生的内存泄漏量。我们在一次应用程序运行中执行了大量的
XmlSerialization
。没关系,您遇到的具体问题是什么?我看不出您当前的使用有什么明显的问题。另一个问题:是否可以选择在此处使用ConcurrentDictionary并删除锁代码?IIRC,
XmlSerializer
已经基于类型在内部执行缓存,因此反复为同一类型实例化新的缓存非常快。您希望通过这样做获得可衡量的绩效收益吗?编辑:那么您在尝试时遇到的具体问题是什么?“试图使用以下内容但没有任何效果”并没有太大帮助。啊,对我关于性能的评论不予理睬;这是关于内存泄漏的(尽管在我使用
XmlSerializer
的经验中,我没有内存问题)@ChrisSinclair为了提高性能,XML序列化基础结构动态生成程序集来序列化和反序列化指定的类型。基础结构查找并重用这些程序集。-我没有意识到它在内部执行基于类型的缓存。我所追求的是限制可能发生的内存泄漏量。我们在一次应用程序运行中执行了大量的
XmlSerialization
。没关系,您遇到的具体问题是什么?我没有发现您当前的使用有任何明显的问题。另一个问题:是否可以选择在此处使用ConcurrentDictionary并删除锁代码?