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并删除锁代码?