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 su true 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, TimeZoneInfoTypeValueTuple. 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, impostare JsonSerializerOptions.ReferenceHandler su ReferenceHandler.Preserve.

  • Serialization può essere ampiamente personalizzato con contratti personalizzati, sbloccando molti scenari riducendo al minimo le modifiche ai tipi serializzati.