2013-05-24 4 views
3

Я хочу кэшировать один экземпляр DataContractSerializer, который будет использоваться несколькими потоками одновременно, чтобы избежать штрафа за многократное создание сериализатора для одного и того же корневого типа. Каждый поток будет сериализовать другой объект, но сам объект DataContractSerializer будет совместно использоваться. (Я не буду использовать IDataContractSurrogate или DataContractResolver, что, очевидно, связано с более сложными/формальными схемами XML/XSD.)Является ли System.Runtime.Serialization.DataContractSerializer потоком безопасным?

Будет ли я в порядке?

In MSDN under "Thread Safety" for System.Runtime.Serialization.DataContractSerializer, он говорит:

Экземпляры этого класса являются безопасными исключением случаев, когда экземпляр используется с осуществлением IDataContractSurrogate или DataContractResolver нить.

Я нахожу это немного расплывчатым (как это типично для руководства по безопасности нитей MSDN), но, похоже, это указывает на то, что мой вариант использования подходит. Бонус, если вы можете указать на личный опыт, единичный тест или демонтаж рамы, который его демонстрирует :)

P.S. Я не думаю, что это дубликат Is WCF's DataContractSerilaizer thread safe?, потому что проблема этого человека оказалась не связанной с безопасностью потока самого DataContractSerializer.

+0

Вы не можете использовать единичный тест или личный опыт, чтобы продемонстрировать, что что-то безопасно для потоков. Вы можете использовать это, чтобы доказать, что что-то ** не является ** потокобезопасным, но не обязательно по требованию :) –

+0

Трудно сказать, он разбросался повсюду. Нет смысла сохранять копию килобайт при записи мегабайта в потоке. –

+0

@MarcGravell Я полагаю, что в * теории * невозможно доказать безопасность потоков при единичном тесте, в конечном счете, из-за некоторой проблемы остановки/полноты Тьюринга. Но, по моему опыту, большинство проблем с безопасностью потоков, по-видимому, воспроизводимы с помощью единичного теста, который делает несколько минут действительно интенсивной многопоточности и знает, какую коррупцию искать. Я просто надеялся, что кто-то уже узнает, и избавит меня от необходимости писать тесты (или читать разборку рамок) :) –

ответ

1

Да, ваш случай использования подходит. Реализации для DataContractResolver и IDataContractSurrogate выполняются пользователем DataContractSerializer. Если вы не реализовали и не настраивали их, не было проблем с потоками (иначе документация MSDN была бы неправильной).

Я бы даже пошел дальше и предположил, что MSDN исключил использование DataContractResolver и IDataContractSurrogate, потому что они могут быть выполнены неверно (т. Е. Не потокобезопасны). Но, к сожалению, в документации для этого нет никаких доказательств.

+0

Спасибо. Всегда полезно, чтобы несколько глаз читали документацию, чтобы убедиться, что все мы интерпретируем одно и то же значение. –

Смежные вопросы