Condividi tramite


I costruttori senza parametri che non sono pubblici non sono utilizzati per la deserializzazione.

Per coerenza in tutti i moniker del framework di destinazione supportati (TFM), i costruttori senza parametri non pubblici 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 in .NET Core 3.0 e 3.1. In .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 è coerente tra il pacchetto NuGet e le API predefinite. 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, viene generata un'eccezione NotSupportedException se si tenta di deserializzare il tipo.

Versione introdotta

5.0

Motivo della modifica

  • Per applicare un comportamento coerente tra tutti i moniker del framework di destinazione (TFM) per i quali System.Text.Json viene creato (.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 possiedi il tipo e se possibile, puoi rendere pubblico il costruttore senza parametri.
  • In caso contrario, implementare un JsonConverter<T> per il tipo e gestire il comportamento di deserializzazione. È possibile chiamare un costruttore non pubblico da un'implementazione JsonConverter<T> se le regole di accessibilità C# per tale scenario lo consentono.

Le API interessate