Не являющиеся открытыми конструкторы без параметров не используются для десериализации
Чтобы гарантировать согласованность, во всех поддерживаемых моникерах целевой платформы (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# для этого сценария.