【问题标题】:XmlSerializer Caching FactoryXmlSerializer 缓存工厂
【发布时间】:2014-01-30 22:30:54
【问题描述】:

came across a factory class,如果我想替换以下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);

工厂类

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

【问题讨论】:

  • IIRC,XmlSerializer 已经在内部根据类型执行缓存,因此一遍又一遍地为相同类型实例化新的缓存很快。您是否期望通过此操作实现可衡量的性能提升?编辑:您尝试过的具体问题是什么? “尝试使用以下无济于事”并没有太大帮助。
  • 啊,关于 cmet 关于性能的问题,我无视我;这是关于内存泄漏的(尽管根据我使用XmlSerializer 的经验,我没有遇到内存问题)
  • @ChrisSinclair 为了提高性能,XML 序列化基础结构动态生成程序集以序列化和反序列化指定类型。基础结构查找并重用这些程序集。 -- 我没有意识到它在内部根据类型执行缓存。我所追求的是限制可能发生的内存泄漏量。我们在单个应用程序运行中执行了很多XmlSerialization
  • 很好,您遇到的具体问题是什么?我没有立即看出您当前的使用有什么问题。
  • 另一个问题:是否可以在这里使用 ConcurrentDictionary 并删除锁定代码?

标签: c# asp.net c#-4.0 factory-pattern xmlserializer


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多