Ответ 1
Да, это хорошая идея. Нет, никаких проблем с этим нет. В частности, безопасность потоков не является проблемой - из документация MSDN для класса XmlSerializer
:
Безопасность потоков
Этот тип является потокобезопасным.
У меня есть класс, который использует 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);
}
// ...
}
Я рассматриваю возможность создания Serializer private static
, поэтому один экземпляр разделяется между всеми Foos. Это хорошая идея или есть возможные проблемы?
Да, это хорошая идея. Нет, никаких проблем с этим нет. В частности, безопасность потоков не является проблемой - из документация MSDN для класса XmlSerializer
:
Безопасность потоков
Этот тип является потокобезопасным.
Согласно Нилу - еще более универсальный и безопасный через Generics и readonly:
public static class Helper<T>
{
public static readonly XmlSerializer Serializer = new XmlSerializer(typeof(T));
}
Использовать как:
Helper<My>.Serializer
Одним из способов было бы создать XmlSerializers factory и ссылаться на него статически (или как ссылка 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>();
}
Да. В общем, вы захотите сделать это для всех ваших классов сериализатора. Это может значительно ускорить ваше приложение.
Самый простой способ сделать это:
public static class MySerializers {
public static XmlSerializer MyType = new XmlSerializer(typeof(MyType));
}
Затем, когда вам нужен сериализатор, вы можете просто вызвать:
MySerializers.MyType
Также обратите внимание, что в соответствии с семантикой С# статические классы инициализируются при первом использовании, а не во время загрузки. Если вы хотите, чтобы все затраты на загрузку были впереди, вам нужно явно получить доступ к классу.