Eseguire la migrazione a DataContractSerializer (XML)

Le librerie di classi di base .NET forniscono due serializzatori XML: XmlSerializer e DataContractSerializer. Esistono alcune piccole differenze tra questi due, ma ai fini della migrazione, questa sezione è incentrata solo su DataContractSerializer. Perché? Poiché supporta completamente il serialization modello di programmazione usato da BinaryFormatter. Tutti i tipi già contrassegnati come [Serializable] o implementano ISerializable possono essere serializzati con DataContractSerializer. Dov'è il trucco? I tipi noti devono essere specificati in anticipo. È necessario conoscerli ed essere in grado di ottenere Type, anche per i tipi privati.

Non è necessario specificare le raccolte o i tipi primitivi più diffusi come string o DateTime (il serializzatore ha un proprio elenco di elementi consentiti predefiniti), ma esistono eccezioni come DateTimeOffset. Per altre informazioni sui tipi supportati, vedere Tipi supportati dal serializzatore del contratto dati.

L'attendibilità parziale è una funzionalità di .NET Framework che non è stata portabilità in .NET (Core). Se il codice viene eseguito in .NET Framework e usa questa funzionalità, leggere le informazioni sulle limitazioni che potrebbero essere applicate a tale scenario.

Guida dettagliata alla migrazione

  1. Trovare tutti gli utilizzi di BinaryFormatter.
  2. Assicurarsi che i percorsi di serialization codice siano trattati con i test, in modo da poter verificare le modifiche ed evitare di introdurre bug.
  3. Non è necessario installare alcun pacchetto, come DataContractSerializer fa parte delle librerie .NET Core.
  4. Trovare tutti i tipi serializzati con BinaryFormatter. Non è necessario modificarli, ma potrebbe essere necessario elencarli tramite knownTypes l'argomento del DataContractSerializer costruttore.
  5. Sostituire l'utilizzo di BinaryFormatter con DataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });