24

我有一个XmlSerializer在其Read/WriteXml方法中使用 an 的类。序列化器目前是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);
    }
    // ...
}

我正在考虑制作序列化private static程序,因此所有 Foos 之间共享一个实例。这是个好主意,还是可能存在问题?

4

4 回答 4

40

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

线程安全

这种类型是线程安全的。

于 2009-07-16T07:54:14.513 回答
16

根据尼尔的说法 - 通过泛型和只读更加通用和安全:

public static class Helper<T>
{
    public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(T));
}

用于:

Helper<My>.Serializer
于 2012-04-17T10:42:19.970 回答
7

一种方法是创建一个 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>();
}
于 2010-01-19T08:42:32.080 回答
4

是的。通常,您会希望对所有序列化程序类执行此操作。它可以显着加快您的应用程序

最简单的方法是:

public static class MySerializers {
   public static XmlSerializer MyType = new XmlSerializer(typeof(MyType));    
}

然后,当您需要序列化程序时,您可以简单地调用:

MySerializers.MyType

另请注意,根据 C# 语义,静态类在首次使用时初始化,而不是在加载时初始化。如果您想将所有负载成本放在前面,则需要显式访问该类。

于 2009-09-17T22:51:37.620 回答