我有一个在XmlSerializer
方法中使用Read/WriteXml
的课程。 Serializer目前是private readonly
。
public class Foo : IXmlSerializable
{
private Bar _bar = new Bar();
private readonly XmlSerializer serBar = new XmlSerializer (typeof (Bar));
public void WriteXml (XmlWriter writer)
{
serBar.Serialize (writer, Bar);
}
// ...
}
我正在考虑改为使用Serializer private static
,因此所有Foos之间共享一个实例。这是一个好主意,还是存在可能的问题?
答案 0 :(得分:33)
是的,这是个好主意。不,它没有任何问题。特别是,线程安全不是一个问题 - 来自MSDN documentation for XmlSerializer
class:
线程安全
此类型是线程安全的。
答案 1 :(得分:14)
根据Neal的说法 - 通过泛型和readonly更加普遍和安全:
public static class Helper<T>
{
public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(T));
}
用作:
Helper<My>.Serializer
答案 2 :(得分:6)
一种方法是创建一个XmlSerializers工厂并静态引用它(或作为IoC引用),如:
public class XmlSerializerFactory
{
public XmlSerializer GetSerializerFor<T>()
{
lock (this)
{
Type typeOfT = typeof(T);
if (false == serializers.ContainsKey(typeOfT))
{
XmlSerializer newSerializer = new XmlSerializer(typeOfT);
serializers.Add(typeOfT, newSerializer);
}
return serializers[typeOfT];
}
}
private Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();
}
答案 3 :(得分:4)
是。通常,您需要为所有序列化程序类执行此操作。它可以大大加快您的应用程序
最简单的方法是:
public static class MySerializers {
public static XmlSerializer MyType = new XmlSerializer(typeof(MyType));
}
然后,当您需要序列化程序时,您只需调用:
MySerializers.MyType
另请注意,根据C#语义,静态类在首次使用时初始化,而不是在加载时初始化。如果您想预先承担所有负载成本,则需要明确访问该类。