Costruttori non pubblici senza parametri non usati per la deserializzazione

Per coerenza in tutti i moniker del framework di destinazione supportati (TFM), i costruttori non pubblici senza parametri non vengono più usati per la deserializzazione con JsonSerializer, per impostazione predefinita.

Descrizione delle modifiche

I pacchetti NuGet System.Text.Json autonomi che supportano .NET Standard 2.0 e versioni successive, ovvero le versioni 4.6.0-4.7.2, si comportano in modo incoerente con il comportamento predefinito su .NET Core 3.0 e 3.1. Su .NET Core 3.x i costruttori interni e privati possono essere usati per la deserializzazione. Nei pacchetti autonomi non sono consentiti costruttori non pubblici e viene generata un'eccezione MissingMethodException se non è definito alcun costruttore pubblico senza parametri.

A partire da .NET 5 e dal pacchetto NuGet System.Text.Json 5.0.0, il comportamento del pacchetto NuGet e delle API predefinite è coerente. I costruttori non pubblici, inclusi i costruttori senza parametri, vengono ignorati dal serializzatore per impostazione predefinita. Il serializzatore usa uno dei costruttori seguenti per la deserializzazione:

  • Costruttore pubblico annotato con JsonConstructorAttribute.
  • Costruttore pubblico senza parametri.
  • Costruttore pubblico con parametri (se è l'unico costruttore pubblico presente).

Se nessuno di questi costruttori è disponibile, se si tenta di deserializzare il tipo viene generata un'eccezione NotSupportedException.

Versione introdotta

5.0

Motivo della modifica

  • Per applicare un comportamento coerente a tutti i moniker del framework di destinazione (TFM) compilati da System.Text.Json (.NET Core 3.0 e versioni successive e .NET Standard 2.0)
  • Poiché JsonSerializer non deve chiamare l'area di superficie non pubblica di un tipo, sia che si tratti di un costruttore, di una proprietà o di un campo.
  • Se sei proprietario del tipo ed è fattibile, rendi pubblico il costruttore senza parametri.
  • In caso contrario, implementa un JsonConverter<T> per il tipo e controlla il comportamento di deserializzazione. Puoi chiamare un costruttore non pubblico da un'implementazione JsonConverter<T> se le regole di accessibilità C# per tale scenario lo consentono.

API interessate