Поделиться через


Новые перегрузки генератора исходного кода 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.