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.
Azione consigliata
- 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.