Migrer vers DataContractSerializer (XML)

Les bibliothèques de classes de base .NET fournissent deux sérialiseurs XML : XmlSerializer et DataContractSerializer. Il existe de légères différences entre ces deux éléments, mais, dans le cadre de la migration, cette section se concentre uniquement sur DataContractSerializer. Pourquoi ? Étant donné qu’il prend entièrement en charge le modèle de programmation de sérialisation utilisé par BinaryFormatter. Tous les types qui sont déjà marqués comme [Serializable] ou qui implémentent ISerializable peuvent être sérialisés avec DataContractSerializer. Où est le piège ? Les types connus doivent être spécifiés à l’avance. Vous devez les connaître et être capable de récupérer le Type, même pour les types privés.

Il n’est pas nécessaire de spécifier la plupart des collections populaires ni les types primitifs, comme string ou DateTime (le sérialiseur possède sa propre liste d’autorisation par défaut), mais il existe des exceptions, comme DateTimeOffset. Pour plus d’informations sur les types pris en charge, consultez Types pris en charge par le sérialiseur de contrat de données.

L’approbation partielle est une fonctionnalité de .NET Framework qui n’a pas été portée sur .NET (Core). Si votre code s’exécute sur .NET Framework et utilise cette fonctionnalité, découvrez les limitations qui peuvent s’appliquer à ce scénario.

Migration pas à pas

  1. Recherchez toutes les utilisations de BinaryFormatter.
  2. Vérifiez que les chemins de code de sérialisation sont couverts par des tests. Vous pouvez donc vérifier vos modifications et éviter d’introduire des bogues.
  3. Vous n’avez pas besoin d’installer des packages, car DataContractSerializer fait partie des bibliothèques principales de .NET.
  4. Recherchez tous les types sérialisés avec BinaryFormatter. Vous n’avez pas besoin de les modifier, mais il peut être nécessaire de les lister via l’argument knownTypes du constructeur DataContractSerializer.
  5. Remplacez l’utilisation de BinaryFormatter par DataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });