Start Debugging
2023-10-19 Обновлено 2023-11-05 csharpdotnetdotnet-8 Edit on GitHub

Добавление/удаление TypeInfoResolver у существующих JsonSerializerOptions

Узнайте, как добавлять или удалять экземпляры TypeInfoResolver у существующих JsonSerializerOptions с помощью нового свойства TypeInfoResolverChain в .NET 8.

Начиная с .NET 8, в классе JsonSerializerOptions появилось новое свойство TypeInfoResolverChain в дополнение к уже существующему TypeInfoResolver. Благодаря этому свойству не обязательно перечислять все резолверы в одном месте — вы можете добавлять их позже, по мере необходимости.

Рассмотрим пример:

var options = new JsonSerializerOptions
{
    TypeInfoResolver = JsonTypeInfoResolver.Combine(
        new ResolverA(), 
        new ResolverB()
    );
};

options.TypeInfoResolverChain.Add(new ResolverC());

Помимо добавления новых type resolvers к существующему JsonSerializerOptions, TypeInfoResolverChain позволяет также удалять type info resolvers из настроек сериализатора.

options.TypeInfoResolverChain.RemoveAt(0);

Если вы хотите запретить изменения цепочки type info resolver, это можно сделать пометив экземпляр JsonSerializerOptions как только для чтения. Для этого нужно вызвать метод MakeReadOnly() у экземпляра options. После этого любая попытка изменить цепочку type info resolver приведёт к следующему InvalidOperationException.

Unhandled exception. System.InvalidOperationException: This JsonSerializerOptions instance is read-only or has already been used in serialization or deserialization.
   at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerOptionsReadOnly(JsonSerializerContext context)
   at System.Text.Json.JsonSerializerOptions.VerifyMutable()
   at System.Text.Json.JsonSerializerOptions.OptionsBoundJsonTypeInfoResolverChain.OnCollectionModifying()
   at System.Text.Json.Serialization.ConfigurationList`1.Add(TItem item)

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад