Eseguire la migrazione a System.Text.Json (JSON)
Per impostazione predefinita, la libreria System.Text.Json
enfatizza il comportamento letterale e deterministico ed evita qualsiasi ipotesi o interpretazione da parte del chiamante. La libreria è progettata intenzionalmente in questo modo per garantire prestazioni e sicurezza. Sebbene System.Text.Json
sia altamente configurabile e le relative funzionalità possano essere usate per ridurre al minimo le modifiche necessarie per i tipi serializzati, è importante considerare i compromessi tra la gestione dei tipi esistenti con il minor numero possibile di modifiche rispetto ai tipi di refactoring per abilitare idiomatici e sicuri serialization.
Quando si esegue la migrazione da BinaryFormatter a System.Text.Json
, è fondamentale prendere nota dei comportamenti e delle opzioni seguenti:
Per impostazione predefinita, i campi non vengono serializzati o deserializzati da
System.Text.Json
, ma possono essere annotati per serialization. In alternativa,JsonSerializerOptions.IncludeFields
è possibile impostare con cautela sutrue
per includere tutti i campi pubblici per i tipi da serializzare.JsonSerializerOptions options = new() { IncludeFields = true };
Per impostazione predefinita, System.Text.Jsonignora i campi e le proprietà private. È possibile abilitare l'utilizzo di una funzione di accesso non pubblica su una proprietà utilizzando l'attributo
[JsonInclude]
. L'inclusione di campi privati richiede un lavoro aggiuntivo non semplice.System.Text.Json non può deserializzare campi o proprietà di sola lettura, ma l'attributo
[JsonConstructor]
può essere usato per indicare che il costruttore specificato deve essere utilizzato per creare istanze del tipo alla deserializzazione. Il costruttore può impostare i campi e le proprietà di sola lettura.Per eseguire l'override del comportamento predefinito serialization per un tipo specifico, è possibile scrivere convertitori personalizzati.
Supporta serialization e deserializzazione di molte raccolte, ma esistono limitazioni. Consultare la documentazione tipi supportati per informazioni dettagliate sui tipi e collezioni supportate per serialization e deserializzazione.
In determinate condizioni, supporta serialization e deserializzazione di raccolte generiche personalizzate.
Altri tipi senza supporto predefinito sono:
DataSet
,DataTable
,DBNull
,TimeZoneInfo
,Type
,ValueTuple
. Tuttavia, è possibile scrivere un convertitore personalizzato per supportare questi tipi.Supporta la gerarchia serialization dei tipi polimorfici e la deserializzazione in cui i tipi sono stati esplicitamente accodati tramite l'attributo o il
[JsonDerivedType]
convertitore personalizzato. Le gerarchie di ereditarietà aperta non sono supportate e il round trip con polimorfismo richiede identificatori discriminatori di tipo per tutti i tipi derivati noti.L'attributo
[JsonIgnore]
in una proprietà fa sì che la proprietà venga omessa dal codice JSON durante la serialization.Per mantenere i riferimenti e gestire riferimenti circolari in
System.Text.Json
, impostareJsonSerializerOptions.ReferenceHandler
suReferenceHandler.Preserve
.Serialization può essere ampiamente personalizzato con contratti personalizzati, sbloccando molti scenari riducendo al minimo le modifiche ai tipi serializzati.