我的问题是这个代码线程安全吗?
我尝试将XmlSerializer
对象缓存在本地dictionary
对象中,以便在需要时可以重用它以避免内存泄漏。由于XmlSerializer将程序集加载到内存中而从不卸载。
字典中将有四个可能的XmlSerializer对象。您可以说在静态构造函数中创建所有四个XmlSerializer(具有不同的构造函数集)对象,并在需要时使用。这样它就是一个线程安全的,因为我们可以保证静态构造函数只运行一次。但是如果没有人使用应用程序的xmlserializer功能会怎么样呢。然后记忆那些消耗的对象将被浪费。
我可以创建线程安全的单例对象。但我对XmlSerializer的上下文更感兴趣。
我经历了很多关于线程安全和锁定的帖子。像这样(http://csharpindepth.com/Articles/General/Singleton.aspx)文章更详细地讲述但是没有特别发现XmlSerialization。
所以任何想法都会受到高度赞赏!
public class SerializeableEntity
{
private readonly static Dictionary<string, XmlSerializer> serializerCache = new Dictionary<string, XmlSerializer>();
public string SerializeIntoXml(SerializeableEntity ObjToSerialize,xmlAttributeOverrides omitProperties,string key)
{
XmlSerializer serializer=GetSerializerObj(key, ObjToSerialize.GetType(), omitProperties);
//... rest of the logic
}
private XmlSerializer GetSerializerObj(string key, Type type, XmlAttributeOverrides xmlAttributeOverrides)
{
XmlSerializer serializer = null;
serializerCache.TryGetValue(key, out serializer);
if (serializer == null)
{
serializer = xmlAttributeOverrides != null ? new XmlSerializer(type, xmlAttributeOverrides) : new XmlSerializer(type);
serializerCache.Add(key, serializer);
}
return serializer;
}
}