Это - язык, который использовался в эру COM для определения интерфейсов (предположительно), нейтральным в отношении языка способом.
According to MSDN:
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not гарантированно поточно-ориентированная.
Значит, вам нужно синхронизировать доступ к методам сериализации / десериализации.
Выявили ли вы конкретные проблемы с производительностью, каждый раз создавая локальный экземпляр сериализатора?
ОБНОВЛЕНИЕ:
Я бы доверял MSDN, потому что даже если в некоторых случаях мы можем проверить, что члены экземпляра могут быть потокобезопасными, это не означает, что со следующим пакетом обновления / обновлением / версией фреймворка так и будет.
Просмотр с помощью Reflector конструктора BinaryFormatter :
public BinaryFormatter()
{
this.m_typeFormat = FormatterTypeStyle.TypesAlways;
this.m_securityLevel = TypeFilterLevel.Full;
this.m_surrogates = null;
this.m_context = new StreamingContext(StreamingContextStates.All);
}
И конструктор StreamingContext:
public StreamingContext(StreamingContextStates state, object additional)
{
this.m_state = state;
this.m_additionalContext = additional;
}
Откровенно говоря, присвоение 6 свойств (большинство из которых перечисления
) должно быть невероятно быстрым. IMHO большая часть времени будет потрачена на методы сериализации / десериализации.
Вы можете использовать атрибут [ThreadStatic] и инициализировать его, если значение равно нулю. Это будет работать, если вы повторно используете потоки.
[ThreadStatic]
private static BinaryFormatter formatter = null;
public static T DeepClone<T>(this T a)
{
if( formatter == null ) formatter = new BinaryFormatter();
using(MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, a);
stream.Position = 0;
return (T)formatter.Deserialize(stream);
}
}
Конечно, другой вариант - использовать Relfector.Net от Red Gate и проверить реализацию двоичного форматтера. После прочтения кода вы сможете решить, безопасен ли он для многопоточного использования; однако Дарин прав в том, что в будущем выпуске он может сломаться.