Не являющиеся открытыми конструкторы без параметров не используются для десериализации

Чтобы гарантировать согласованность, во всех поддерживаемых моникерах целевой платформы (TFM) не являющиеся открытыми конструкторы без параметров больше не используются для десериализации с помощью JsonSerializer по умолчанию.

Описание изменения

Поведение отдельных пакетов NuGet System.Text.Json, которые поддерживают .NET Standard 2.0 и более поздних версий (версии с 4.6.0 по 4.7.2), согласуется со встроенным поведением в .NET Core 3.0 и 3.1. В .NET Core 3. x внутренние и закрытые конструкторы можно использовать для десериализации. В отдельных пакетах не допускаются конструкторы, не являющиеся открытыми, и создается исключение MissingMethodException, если не определен открытый конструктор без параметров.

Начиная с .NET 5 и версии 5.0.0 пакета NuGet System.Text.Json согласовано поведение между пакетом NuGet и встроенными API. Сериализатор по умолчанию игнорирует не являющиеся открытыми конструкторы, в том числе конструкторы без параметров. Сериализатор использует для десериализации один из следующих конструкторов:

  • Открытый конструктор, помеченный атрибутом JsonConstructorAttribute.
  • Открытый конструктор без параметров.
  • Открытый параметризованный конструктор (если это единственный открытый конструктор).

Если ни один из этих конструкторов не доступен, при попытке десериализовать тип возникает исключение NotSupportedException.

Представленные версии

5,0

Причина изменения

  • Принудительно обеспечить согласованное поведение между всеми моникерами целевой платформы (TFM), для которых создается System.Text.Json (.NET Core 3.0 и более поздних версий и .NET Standard 2.0)
  • Поскольку JsonSerializer не должен выполнять вызовы к не являющейся открытой контактной зоне типа, будь то конструктор, свойство или поле.
  • Если вы являетесь владельцем типа и это целесообразно, сделайте конструктор без параметров открытым.
  • В противном случае реализуйте для типа JsonConverter<T> и обеспечьте контроль десериализации. Можно вызвать конструктор, не являющийся открытым, из реализации JsonConverter<T>, если это разрешено правилами специальных возможностей C# для этого сценария.

Затронутые API