Должен ли я сделать этот XmlSerializer статическим? - PullRequest
18 голосов
/ 16 июля 2009

У меня есть класс, который использует XmlSerializer в своих Read/WriteXml методах. Сериализатор в настоящее время 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 ]

33 голосов
/ 16 июля 2009

Да, это хорошая идея. Нет, с этим проблем нет. В частности, безопасность потоков не является проблемой - из документации MSDN для XmlSerializer класс :

Резьба безопасности

Этот тип является потокобезопасным.

14 голосов
/ 17 апреля 2012

Согласно Нилу - еще более универсален и безопасен с помощью Generics и только для чтения:

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

Использовать как:

Helper<My>.Serializer
6 голосов
/ 19 января 2010

Один из способов - создать фабрику 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>();
}
4 голосов
/ 18 сентября 2009

Да. В общем, вы захотите сделать это для всех ваших классов сериализатора. Это может значительно ускорить ваше приложение

Самый простой способ сделать это:

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

Тогда, когда вам нужен сериализатор, вы можете просто позвонить:

MySerializers.MyType

Также обратите внимание, что в соответствии с семантикой C # статические классы инициализируются при первом использовании, а не во время загрузки. Если вы хотите заранее оценить всю стоимость загрузки, вам нужно явно обратиться к классу.

...