Scegliere un serializzatore

Non esistono vere e proprie sostituzioni di BinaryFormatter, ma esistono diversi serializzatori consigliati per la serializzazione di tipi .NET. Indipendentemente dal serializzatore scelto, saranno necessarie modifiche per l'integrazione con il nuovo serializzatore. Durante queste migrazioni, è importante considerare i compromessi tra la conversione del nuovo serializzatore per gestire i tipi esistenti con il minor numero possibile di modifiche rispetto ai tipi di refactoring per abilitare la serialization idiomatica con il serializzatore scelto. Dopo aver scelto un serializzatore, occorre studiare la relativa documentazione per le procedure consigliate.

Se un formato di serialization binaria non è un requisito, è possibile prendere in considerazione l'uso di formati di serialization JSON o XML. Questi serializzatori sono inclusi in .NET e sono ufficialmente supportati.

  1. JSON con System.Text.Json
  2. XML con System.Runtime.Serialization.DataContractSerializer

Se per gli scenari è importante una rappresentazione binaria compatta, si consigliano i seguenti formati di serialization e serializzatori open source:

  1. MessagePack con MessagePack per C#
  2. Protocol Buffer con protobuf-net

La disponibilità o meno del controllo per modificare la forma dell'API del tipo serializzato, influirà sulla direzione e sull'approccio alla serialization. La migrazione a questi serializzatori può essere più semplice con la possibilità di annotare i tipi con nuovi attributi, aggiungere nuovi costruttori, rendere pubblici i tipi/membri e modificare i campi in proprietà. Senza tale capacità, l'uso di serializzatori moderni potrebbe richiedere l'implementazione di convertitori o resolver personalizzati.

Funzionalità BinaryFormatter System.Text.Json DataContractSerializer MessagePack per C# protobuf-net
formato Serialization binario (NRBF) JSON XML binario (MessagePack) binario (Protocol Buffers)
Rappresentazione compatta ✔️ ✔️ ✔️
Leggibile dall'utente ❌️ ✔️ ✔️ ❌️ ❌️
Prestazioni ❌️ ✔️ ✔️ ✔️
Supporto dell'attributo [Serializable]. ✔️ ✔️
Serializzazione di tipi pubblici ✔️ ✔️ ✔️ ✔️ ✔️
Serializzazione di tipi non pubblici ✔️ ✔️ ✔️ ✔️ (resolver obbligatorio) ✔️
Serializzazione dei campi ✔️ ✔️ (consenso esplicito) ✔️ ✔️ (attributo obbligatorio) ✔️ (attributo obbligatorio)
Serializzazione di campi non pubblici ✔️ ✔️ (resolver obbligatorio) ✔️ ✔️ (resolver obbligatorio) ✔️ (attributo obbligatorio)
Serializzazione di proprietà ✔️* ✔️ ✔️ ✔️ (attributo obbligatorio) ✔️ (attributo obbligatorio)
Deserializzazione di membri di sola lettura ✔️ ✔️ (attributo obbligatorio) ✔️ ✔️ ✔️ (costruttori senza parametri obbligatorio)
Gerarchia di tipi polimorfici ✔️ ✔️ (attributo obbligatorio) ✔️ ✔️ (attributo obbligatorio) ✔️ (attributo obbligatorio)
Supporto AOT ❌️ ✔️ ✔️ ❌ (pianificato)

JSON con System.Text.Json

La libreria System.Text.Json è un serializzatore moderno che enfatizza la sicurezza, le prestazioni elevate e l'allocazione di memoria insufficiente per il formato JSON (JavaScript Object Notation). JSON è leggibile dall'utente e offre un ampio supporto multipiattaforma. Anche se il formato basato su testo non è così compatto come i formati binari, può essere notevolmente ridotto in termini di dimensioni tramite la compressione.

Serialization esclude membri non pubblici e di sola lettura, a meno che non siano gestiti in modo specifico tramite attributi e costruttori. System.Text.Json supporta anche la serialization e deserializzazione personalizzata per un maggiore controllo sul modo in cui i tipi vengono convertiti in JSON e viceversa. System.Text.Json non supporta l'attributo [Serializable].

Eseguire la migrazione a System.Text.Json (JSON).

XML con DataContractSerializer

DataContractSerializer è stato introdotto in .NET Framework 3.0 e viene usato per serializzare e deserializzare i dati inviati nei messaggi di Windows Communication Foundation (WCF). DataContractSerializer è un serializzatore XML che supporta completamente il modello di programmazione della serialization usato da BinaryFormatter, il che significa che rispetta l'attributo [Serializable] e l'implementazione di ISerializable. Per questo motivo è il serializzatore che richiede la quantità minima di sforzo per eseguire la migrazione. Tuttavia, richiede che i tipi noti vengano specificati in anticipo (ma la maggior parte delle raccolte .NET e dei tipi primitivi si trova in un elenco di elementi consentiti predefiniti e non deve essere specificata).

Anche se DataContractSerializer offre questi vantaggi funzionali durante la migrazione da BinaryFormatter, non è così moderno o efficace come le altre scelte.

Eseguire la migrazione a DataContractSerializer (XML).

Binario con MessagePack

MessagePack è un formato di serialization binaria compatto, che per questo genera messaggi di dimensioni inferiori rispetto a JSON e XML. La libreria open source MessagePack per C# offre prestazioni elevate e fornisce una compressione LZ4 super veloce predefinita per dimensioni di dati ancora più ridotte. Funziona meglio quando i tipi di dati vengono annotati con DataContractSerializer o con gli attributi propri della libreria. Può essere configurato per supportare ambienti AOT, tipi e membri non pubblici e tipi e membri di sola lettura.

Eseguire la migrazione a MessagePack (binario).

Binario con protobuf-net

La libreria libreria protobuf-net è un serializzatore basato sul contratto per .NET che usa il formato binario di Protocol Buffersserialization. L'API segue i tipici modelli .NET ed è ampiamente paragonabile a XmlSerializer e a DataContractSerializer. Questa libreria comune è anche ricca di funzionalità e può gestire tipi e campi non pubblici, ma molti scenari richiedono l'applicazione di attributi ai membri.

Eseguire la migrazione a protobuf-net (binario)..