Icke-offentliga, parameterlösa konstruktorer som inte används för deserialisering

För konsekvens över alla ramverksidentifierare (TFM) som stöds, används icke-offentliga konstruktorer utan parametrar inte längre för deserialisering med JsonSerializer, som standard.

Ändra beskrivning

De fristående System.Text.Json NuGet-paketen som stöder .NET Standard 2.0 och senare, dvs. versionerna 4.6.0-4.7.2, fungerar inkonsekvent med det inbyggda beteendet på .NET Core 3.0 och 3.1. På .NET Core 3.x kan interna och privata konstruktorer användas för deserialisering. I de fristående paketen tillåts inte icke-offentliga konstruktorer och en MissingMethodException genereras om ingen offentlig, parameterlös konstruktor definieras.

Från och med .NET 5 och System.Text.Json NuGet-paket 5.0.0 är beteendet konsekvent mellan NuGet-paketet och de inbyggda API:erna. Icke-offentliga konstruktorer, inklusive parameterlösa konstruktorer, ignoreras som standard av serialiseraren. Serialiseraren använder någon av följande konstruktorer för deserialisering:

  • Offentlig konstruktor kommenterad med JsonConstructorAttribute.
  • Offentlig konstruktor utan parametrar.
  • Offentlig parameteriserad konstruktor (om det är den enda offentliga konstruktorn som finns).

Om ingen av dessa konstruktorer är tillgängliga utlöses en NotSupportedException om du försöker deserialisera typen.

Version lanserad

5,0

Orsak till ändring

  • Så här framtvingar du konsekvent beteende mellan alla målramverksmonikers (TFM:er) som System.Text.Json skapas för (.NET Core 3.0 och senare versioner och .NET Standard 2.0)
  • Eftersom JsonSerializer ska inte anropa den icke-offentliga ytan av en typ, oavsett om det är en konstruktor, en egenskap eller ett fält.
  • Om du äger typen och det är möjligt gör du den parameterlösa konstruktorn offentlig.
  • Implementera annars en JsonConverter<T> för typen och kontrollera deserialiseringsbeteendet. Du kan anropa en icke-offentlig konstruktor från en JsonConverter<T> implementering om C#-hjälpmedelsregler för det scenariot tillåter det.

Berörda API:er