BinaryFormatter, Сериализируют и Десериализовывают ориентированный на многопотоковое исполнение?

Это - язык, который использовался в эру COM для определения интерфейсов (предположительно), нейтральным в отношении языка способом.

14
задан Community 23 May 2017 в 12:31
поделиться

2 ответа

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 большая часть времени будет потрачена на методы сериализации / десериализации.

10
ответ дан 1 December 2019 в 13:33
поделиться

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

8
ответ дан 1 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: