Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 höher unterstützen, d. h. Versionen 4.6.0-4.7.2, verhalten sich inkonsistent mit dem integrierten Verhalten in .NET Core 3.0 und 3.1. Auf .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 ein MissingMethodException Konstruktor wird ausgelöst, wenn kein öffentlicher, parameterloser Konstruktor definiert ist.
Ab .NET 5 und System.Text.Json NuGet-Paket 5.0.0 ist das Verhalten zwischen dem NuGet-Paket und den integrierten APIs konsistent. Nicht öffentliche Konstruktoren, einschließlich parameterloser Konstruktoren, werden standardmäßig vom Serialisierer ignoriert. Der Serialisierer verwendet einen der folgenden Konstruktoren für die Deserialisierung:
- Öffentlicher Konstruktor, annotiert mit JsonConstructorAttribute.
- öffentlicher, parameterloser Konstruktor
- Öffentlicher parametrisierter Konstruktor (wenn es sich um den einzigen öffentlichen Konstruktor handelt, der vorhanden ist).
Wenn keine dieser Konstruktoren verfügbar ist, wird ein NotSupportedException Fehler ausgelöst, wenn Sie versuchen, den Typ deserialisieren.
Eingeführte Version
5.0
Grund für Änderung
- Um ein einheitliches Verhalten zwischen allen Zielframework-Monikern (TFMs) zu erzwingen, für die System.Text.Json erstellt wird (.NET Core 3.0 und höhere Versionen sowie .NET Standard 2.0)
- JsonSerializer soll den nicht öffentlichen Oberflächenbereich eines Typs nicht aufrufen, egal, ob es sich um einen Konstruktor, eine Eigenschaft oder ein Feld handelt.
Empfohlene Aktion
- Wenn Sie den Typ besitzen und dies möglich ist, machen Sie den parameterlosen Konstruktor öffentlich.
- Implementieren Sie andernfalls einen JsonConverter<T> für den Typ, und steuern Sie das Deserialisierungsverhalten. Sie können einen nicht öffentlichen Konstruktor aus einer JsonConverter<T> Implementierung aufrufen, wenn C#-Barrierefreiheitsregeln für dieses Szenario dies zulassen.