我应该使这个XmlSerializer静态吗?

maf*_*afu 20 c# static instance xml-serialization

我有一个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);
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑private static改为使用Serializer ,因此所有Foos之间共享一个实例.这是个好主意,还是有可能存在问题?

Pav*_*aev 34

是的,这是个好主意.不,它没有任何问题.特别是,线程安全不是问题 - 从 类的MSDN文档XmlSerializer:

线程安全

这种类型是线程安全的.

  • 啊,太棒了,除非有新的东西出现,否则这将成为公认的答案.:) (2认同)

小智 14

根据Neal的说法 - 通过泛型和readonly更加普遍和安全:

public static class Helper<T>
{
    public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

用于:

Helper<My>.Serializer
Run Code Online (Sandbox Code Playgroud)


Igo*_*ejc 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>();
}
Run Code Online (Sandbox Code Playgroud)