非パブリック、パラメーターなしのコンストラクターが逆シリアル化に使用されない

サポートされているすべてのターゲット フレームワーク モニカー (TFM) との間で一貫性を維持するために、既定では、非パブリックのパラメーターなしのコンストラクターは JsonSerializer での逆シリアル化に使用されなくなりました。

変更内容

.NET Standard 2.0 以降をサポートするスタンドアロン System.Text.Json NuGet パッケージ (つまり、バージョン 4.6.0-4.7.2) の動作は、.NET Core 3.0 および 3.1 の組み込みの動作と一致しません。 .NET Core 3.x では、internal と private コンストラクターを逆シリアル化に使用できます。 スタンドアロン パッケージで、非パブリック コンストラクターは使用できません。また、非パブリックのパラメーターなしのコンストラクターが定義されていない場合は、MissingMethodException がスローされます。

.NET 5 以降および System.Text.Json NuGet パッケージ 5.0.0 では、NuGet パッケージと組み込み API 間で動作に一貫性があります。 非パブリック コンストラクター (パラメーターなしのコンストラクターを含む) は、既定ではシリアライザーによって無視されます。 逆シリアル化のために、次のいずれかのコンストラクターがシリアライザーによって使用されます。

  • JsonConstructorAttribute の注釈が付けられたパブリック コンストラクター。
  • パブリックのパラメーターなしのコンストラクター。
  • パブリックのパラメーター化されたコンストラクター (唯一のパブリック コンストラクターが存在する場合)。

これらのコンストラクターをいずれも使用できない場合は、型を逆シリアル化しようとすると NotSupportedException がスローされます。

導入されたバージョン

5.0

変更理由

  • System.Text.Json のビルド対象のすべてのターゲット フレームワーク モニカー (TFM) の間で一貫した動作を適用するため (.NET Core 3.0 以降のバージョンと .NET Standard 2.0)
  • コンストラクター、プロパティ、またはフィールドのいずれであるかにかかわらず、JsonSerializer から型の非パブリック アクセス領域を呼び出すことができないため。
  • 型を所有していて、それが実行可能な場合は、パラメーターなしのコンストラクターをパブリックにします。
  • それ以外の場合は、型に対して JsonConverter<T> を実装し、逆シリアル化動作を制御します。 そのシナリオの C# アクセシビリティ規則で許可されている場合は、JsonConverter<T> の実装から非パブリック コンストラクターを呼び出すことができます。

影響を受ける API