Новые перегрузки генератора исходного кода JsonSerializer
Компонент System.Text.Json
генератора исходного кода теперь добавляет в JsonSerializer новые перегрузки, которые принимают предварительно сформированные сведения о типе через JsonTypeInfo<T> или JsonSerializerContext. Эти перегрузки обеспечивают оптимизацию производительности по сравнению с уже существующими перегрузками, которые принимают экземпляры JsonSerializerOptions и выполняют отражение во время выполнения. Все эти типы параметров являются ссылочными типами и позволяют передать null
. В следующем примере показаны шаблоны методов и сигнатур для обоих подходов:
Прежние перегрузки на основе отражения или JsonSerializerOptions
:
public static string JsonSerializer.Serialize<T>(T value, JsonSerializerOptions? options = null);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize<T>(string json, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize(string json, Type type, JsonSerializerOptions? options = null);
Новые перегрузки на основе генератора, JsonTypeInfo
или JsonSerializerContext
:
public static string JsonSerializer.Serialize<T>(T value, JsonTypeInfo<T> jsonTypeInfo);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerContext jsonSerializerContext);
public static T JsonSerializer.Deserialize<T>(string json, JsonTypeInfo<T> jsonTypeInfo);
public static object JsonSerializer.Deserialize(string json, Type type, JsonSerializerContext jsonSerializerContext);
Прежнее поведение
Вы могли написать код, который передает null
в качестве значения параметра JsonSerializerOptions, и он успешно компилировался и выполнялся.
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));
Новое поведение
Новые методы генератора исходного кода в .NET 6 могут создавать неоднозначности для компилятора, если вы укажете значение null
для параметра JsonSerializerOptions. Например, пользователь может увидеть следующее сообщение об ошибке:
Вызов неоднозначный между следующими методами или свойствами: "JsonSerializer.Serialize(TValue, JsonSerializerOptions?)" и "JsonSerializer.Serialize(TValue, JsonTypeInfo)
Представленные версии
.NET 6
Тип критического изменения
Это изменение может повлиять на совместимость исходного кода.
Причина изменения
В сериализатор добавлены новые перегрузки для оптимизации производительности. Дополнительные сведения см. в статье о новом генераторе исходного кода System.Text.Json.
Рекомендуемое действие
Обновите код так, чтобы устранить неоднозначность с выбором перегрузки, например выполните явное приведение к требуемому набору типов. Например, можно изменить пример из раздела Прежнее поведение следующим образом:
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));
Другие варианты обходных путей
- Опустите необязательный параметр
JsonSerializerOptions? options = null
. - Используйте именованные аргументы.
Но не забывайте, что нельзя опускать необязательные параметры или использовать именованные аргументы в лямбда-выражениях.
Затронутые API
Все методы System.Text.Json.JsonSerializer.