Подтвердить что ты не робот

Являются ли BinaryFormatter Serialize и Deserialize потоком безопасным?

Ссылка

4b9b3361

Ответ 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 и проанализировать реализацию бинарного форматирования. После прочтения кода вы сможете решить, безопасно ли использование поперечной резьбы; Тем не менее, Дарин прав, поскольку он может разразиться в будущем выпуске.