Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Azione consigliata
- 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.