Condividi tramite


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 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 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, 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.