1
我came across a factory class我不完全確定如何使用它,如果我想要替換下面的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() { 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'已經內部執行基於類型的緩存,因此一次又一次地爲相同類型實例化新的很快。你期望通過這種方式實現可衡量的性能提升嗎?編輯:什麼是你所嘗試過的具體問題? 「試圖使用以下無濟於事」並沒有太多幫助。 –
對於表現的評論,Ahh無視我;這是關於內存泄漏(儘管根據我對'XmlSerializer'的經驗,我沒有遇到內存問題) –
@ChrisSinclair爲了提高性能,XML序列化基礎結構動態生成程序集以序列化和反序列化指定的類型。基礎設施找到並重新使用這些程序集。 - 我沒有意識到它在內部根據類型執行緩存。我所追求的是限制可能發生的內存泄漏量。我們在一次應用程序運行中執行了很多'XmlSerialization'。 – fuzz