Я написал пользовательский IBsonSerializer
для класса System.Security.Claims.Claim
, который очень раздут и нуждается в специальной десериализации.Это работает, когда вызывается как одноразовый, но я сталкиваюсь с проблемами при регистрации и вызове из модульных тестов и получаю страшное исключение «Уже зарегистрирован сериализатор для типа Claim».
Проблема в том, что естьПохоже, нет способа проверить, зарегистрирован ли сериализатор без его создания!Это кажется мне совершенно неправильным.Если вы звоните BsonSerializer.LookupSerializer()
, код вызывает BsonSerializerRegistry.GetSerializer()
, что вызывает GetOrAdd()
.Другими словами, я не могу проверить и затем добавить свой настраиваемый сериализатор без исключения, и если я не проверю, я могу получить ошибку, если она будет добавлена во второй раз.
Я пропустил что-то действительно очевидное здесь?Модульные тесты вызываются в многопоточном процессе, поэтому, несмотря на то, что мои настройки находятся в файле Startup.cs и обычно вызываются только один раз, их можно вызывать параллельно, когда выполняются модульные тесты.
lock (serializerLock)
{
// I can't call the following, otherwise it creates a default serializer
//if ( BsonSerializer.LookupSerializer<System.Security.Claims.Claim>().GetType() != typeof(MongoClaimSerializer))
{
BsonSerializer.RegisterSerializer(new MongoClaimSerializer());
}
}