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


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

Чтобы гарантировать согласованность, во всех поддерживаемых моникерах целевой платформы (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