Migrer vers DataContractSerializer (XML)
Les bibliothèques de classes de base .NET fournissent deux sérialiseurs XML : XmlSerializer et DataContractSerializer. Il existe quelques différences subtiles entre ces deux sérialiseurs, mais quant à la migration, cette section se concentre seulement sur DataContractSerializer
. Pourquoi ? Parce qu’elle prend entièrement en charge le modèle de programmation de serialization 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 en mesure d’obtenir le Type
, même pour les types privés.
Il n’est pas nécessaire de spécifier les collections ou les types primitifs les plus courants, comme string
ou DateTime
(le sérialiseur a sa propre liste verte 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
- Recherchez toutes les utilisations de
BinaryFormatter
. - Assurez-vous que les chemins d’accès au code serialization sont couverts par des tests, pour pouvoir vérifier vos modifications et éviter l'introduction de bogues.
- Vous n’avez pas besoin d’installer des packages, car
DataContractSerializer
fait partie des bibliothèques principales de .NET. - 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’argumentknownTypes
du constructeurDataContractSerializer
. - Remplacez l’utilisation de
BinaryFormatter
parDataContractSerializer
.
DataContractSerializer serializer = new(
type: input.GetType(),
knownTypes: new Type[]
{
typeof(MyType1),
typeof(MyType2)
});