Eseguire la migrazione a System.Text.Json (JSON)
Per impostazione predefinita, la System.Text.Json
libreria sottolinea il comportamento letterale, deterministico ed evita qualsiasi ipotesi o interpretazione per conto del chiamante. La libreria è progettata intenzionalmente in questo modo per garantire sicurezza e prestazioni. 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 al refactoring dei tipi per abilitare la serializzazione idiotica e sicura.
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 la serializzazione. 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 privati e le proprietà. È possibile abilitare l'uso di una funzione di accesso non pubblica in una proprietà usando l'attributo
[JsonInclude]
. L'inclusione di campi privati richiede un lavoro aggiuntivo non semplice.System.Text.Jsonnon 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 di serializzazione predefinito per un tipo specifico, è possibile scrivere convertitori personalizzati.
Supporta la serializzazione e la deserializzazione di molte raccolte, ma esistono limitazioni. Per informazioni dettagliate sulle raccolte supportate per la serializzazione e la deserializzazione, vedere la documentazione relativa ai tipi di raccolta supportati.
In determinate condizioni, supporta la serializzazione e la 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 serializzazione e la deserializzazione della gerarchia dei tipi polimorfici in cui i tipi sono stati esplicitamente acconsentiti 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 serializzazione.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.