Nicht öffentliche parameterlose Konstruktoren, die nicht für die Deserialisierung verwendet werden

Aus Gründen der Konsistenz in allen unterstützten Zielframeworkmonikern (TFMs) werden nicht öffentliche, parameterlose Konstruktoren nicht mehr standardmäßig für die Deserialisierung mit JsonSerializer verwendet.

Änderungsbeschreibung

Die eigenständigen System.Text.Json-NuGet-Pakete, die .NET Standard 2.0 und die höheren Versionen 4.6.0 bis 4.7.2 unterstützen, verhalten sich im Vergleich zum integrierten Verhalten in .NET Core 3.0 und 3.1 inkonsistent. In .NET Core 3.x können interne und private Konstruktoren für die Deserialisierung verwendet werden. In den eigenständigen Paketen sind nicht öffentliche Konstruktoren nicht zulässig, und eine MissingMethodException wird ausgelöst, wenn kein öffentlicher, parameterloser Konstruktor definiert ist.

Ab .NET 5 und dem System.Text.Json-NuGet-Paket 5.0.0 ist das Verhalten des NuGet-Pakets und der integrierten APIs konsistent. Nicht öffentliche Konstruktoren einschließlich parameterloser Konstruktoren werden vom Serialisierungsprogramm standardmäßig ignoriert. Das Serialisierungsprogramm verwendet einen der folgenden Konstruktoren für die Deserialisierung:

  • öffentlicher Konstruktor mit der Anmerkung JsonConstructorAttribute
  • öffentlicher, parameterloser Konstruktor
  • öffentlicher, parametrisierter Konstruktor (falls dies der einzige öffentliche Konstruktor ist)

Wenn keiner dieser Konstruktoren verfügbar ist, wird eine NotSupportedException ausgelöst, wenn Sie versuchen, den Typ zu deserialisieren.

Eingeführt in Version

5.0

Grund für die Änderung

  • Es soll ein konsistentes Verhalten aller Zielframeworkmoniker (TFMs) erzwungen werden, die System.Text.Json für .NET Core 3.0 und höhere Versionen sowie .NET Standard 2.0 erstellt.
  • JsonSerializer soll den nicht öffentlichen Oberflächenbereich eines Typs nicht aufrufen, egal, ob es sich um einen Konstruktor, eine Eigenschaft oder ein Feld handelt.
  • Wenn Sie über den Typ verfügen, veröffentlichen Sie nach Möglichkeit den parameterlosen Konstruktor.
  • Implementieren Sie andernfalls einen JsonConverter<T> für den Typ, und steuern Sie das Deserialisierungsverhalten. Sie können einen nicht öffentlichen Konstruktor über eine JsonConverter<T>-Implementierung aufrufen, wenn dies von den C#-Zugriffsregeln zugelassen wird.

Betroffene APIs