Dela via


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

För konsekvens i alla målramverksmonikers (TFM) som stöds används inte längre icke-offentliga, parameterlösa konstruktorer 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 parameterlös konstruktor.
  • 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 introducerad

5,0

Orsak till ändringen

  • 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.
  • Annars implementerar du en JsonConverter<T> för typen och styr 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