【发布时间】: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