Являются ли BinaryFormatter Serialize и Deserialize потоком безопасным?
Ответ 1
Согласно MSDN:
Любой публичный статический (общий в Visual Basic) членами этого типа являются потоки безопасно. Любые члены экземпляра не являются гарантированно надежный поток.
Итак, вам нужно синхронизировать доступ к методам Serialize/Deserialize.
Определяли ли вы конкретные проблемы с производительностью, создавая экземпляр локального сериализатора каждый раз?
UPDATE:
Я бы доверял MSDN, потому что даже если в некоторых случаях мы можем проверить, что члены экземпляра могут быть потокобезопасными, это не значит, что со следующей версией пакета обновления/обновления/фрейма это будет продолжаться.
Поиск рефлектора в конструкторе 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 свойств (большинство из которых enums
) должно быть ослеплятельно быстрым. ИМХО большую часть времени будет потрачено на методы Serialize/Deserialize.
Ответ 2
Вы можете использовать атрибут [ThreadStatic] и инициализировать, если значение равно null. Это будет работать при условии повторного использования потоков.
[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 и проанализировать реализацию бинарного форматирования. После прочтения кода вы сможете решить, безопасно ли использование поперечной резьбы; Тем не менее, Дарин прав, поскольку он может разразиться в будущем выпуске.