Choisir un sérialiseur
Il n’y a pas de remplacement immédiat pour BinaryFormatter, mais il existe plusieurs sérialiseurs recommandés pour sérialiser les types .NET. Quel que soit le sérialiseur que vous choisissez, des modifications seront nécessaires pour l’intégration au nouveau sérialiseur. Au cours de ces migrations, il est important de prendre en compte les compromis entre, d’un côté, le fait de forcer le nouveau sérialiseur à gérer les types existants avec le moins de modifications possible et, d’un autre côté, la refactorisation des types afin de permettre la serialization idiomatique avec le sérialiseur choisi. Une fois que vous avez choisi un sérialiseur, vous devez étudier sa documentation afin de vous familiariser avec les meilleures pratiques.
Si un format de serialization binaire ne constitue pas une exigence, vous pouvez envisager d’utiliser des formats de serialization JSON ou XML. Ces sérialiseurs sont inclus dans .NET et sont officiellement pris en charge.
- JSON à l’aide de System.Text.Json
- XML à l’aide de
System.Runtime.Serialization.DataContractSerializer
Si une représentation binaire compacte est importante pour vos scénarios, les formats de serialization et sérialiseurs open source suivants sont recommandés :
- MessagePack à l’aide de MessagePack pour C#
- Mémoires tampons de protocole à l’aide de protobuf-net
Le fait que vous ayez ou non le contrôle pour modifier la forme d’API du type sérialisé influencera votre direction et approche envers la serialization. La migration vers ces sérialiseurs peut être plus simple, car elle offre la capacité à annoter les types avec de nouveaux attributs, à ajouter de nouveaux constructeurs, à rendre les types/membres publics, et à changer les champs en propriétés. Sans cette capacité, l’utilisation de sérialiseurs modernes peut nécessiter l’implémentation de convertisseurs ou de programmes de résolution personnalisés.
Fonctionnalité | BinaryFormatter | System.Text.Json | DataContractSerializer | MessagePack pour C# | protobuf-net |
---|---|---|---|---|---|
Format Serialization | binaire (NRBF) | JSON | XML | binaire (MessagePack) | binaire (Mémoires tampon de protocole) |
Représentation compacte | ✔️ | ❌ | ❌ | ✔️ | ✔️ |
Lisible par l’homme | ❌️ | ✔️ | ✔️ | ❌️ | ❌️ |
Performances | ❌️ | ✔️ | ❌ | ✔️ | ✔️ |
Prise en charge de l’attribut [Serializable] |
✔️ | ❌ | ✔️ | ❌ | ❌ |
Sérialisation des types publics | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Sérialisation des types non publics | ✔️ | ✔️ | ✔️ | ✔️ (programme de résolution requis) | ✔️ |
Sérialisation des champs | ✔️ | ✔️ (activation requise) | ✔️ | ✔️ (attribut requis) | ✔️ (attribut requis) |
Sérialisation des champs non publics | ✔️ | ✔️ (programme de résolution requis) | ✔️ | ✔️ (programme de résolution requis) | ✔️ (attribut requis) |
Sérialisation des propriétés | ✔️* | ✔️ | ✔️ | ✔️ (attribut requis) | ✔️ (attribut requis) |
Désérialisation des membres en lecture seule | ✔️ | ✔️ (attribut requis) | ✔️ | ✔️ | ✔️ (ctor sans paramètre requis) |
Hiérarchie des types polymorphes | ✔️ | ✔️ (attribut requis) | ✔️ | ✔️ (attribut requis) | ✔️ (attribut requis) |
Prise en charge d’AOT | ❌️ | ✔️ | ❌ | ✔️ | ❌ (planifié) |
JSON à l’aide de System.Text.Json
La bibliothèque System.Text.Json
est un sérialiseur moderne qui met l’accent sur la sécurité, les performances élevées et l’allocation de mémoire faible pour le format JSON (JavaScript Object Notation). JSON est lisible par l’homme et offre une prise en charge multiplateforme étendue. Même si le format textuel n’est pas aussi compact que les formats binaires, il peut être considérablement réduit par la compression.
Serialization exclut les membres non publics et en lecture seule, sauf s’ils sont spécifiquement gérés par le biais d’attributs et de constructeurs. System.Text.Json prend également en charge la serialization et la désérialisation personnalisées afin de mieux contrôler comment les types sont convertis en JSON et inversement. System.Text.Json ne prend pas en charge l’attribut [Serializable]
.
Migrer vers System.Text.Json (JSON).
XML à l’aide de DataContractSerializer
DataContractSerializer a été introduit dans le .NET Framework 3.0, et est utilisé pour sérialiser et désérialiser les données envoyées dans les messages WCF (Windows Communication Foundation). DataContractSerializer est un sérialiseur XML qui prend entièrement en charge le modèle de programmation de serialization utilisé par le BinaryFormatter
, ce qui signifie qu’il respecte l’attribut [Serializable]
et l’implémentation de ISerializable. Par conséquent, il s’agit du sérialiseur qui nécessite le moins d’efforts de migration. Toutefois, il exige que les types connus soient spécifiés dès le départ (mais la plupart des collections et des types primitifs .NET se trouvent sur une liste verte par défaut et n’ont pas besoin d’être spécifiés).
Bien que DataContractSerializer
offre ces avantages fonctionnels lors de la migration à partir de BinaryFormatter, il n’est pas aussi moderne ou performant que les autres choix.
Migrer vers DataContractSerializer (XML).
Avertissement
Ne confondez pas DataContractSerializer avec NetDataContractSerializer. NetDataContractSerializer est identifié comme un sérialiseur dangereux.
Binaire à l’aide de MessagePack
MessagePack est un format de serialization binaire compact, qui génère des tailles de message plus petites que les formats JSON et XML. La bibliothèque MessagePack pour C# open source est très performante et offre une compression LZ4 ultra-rapide et intégrée pour une taille de données encore plus petite. Elle est plus performante quand les types de données sont annotés avec DataContractSerializer
ou avec les propres attributs de la bibliothèque. Elle peut être configurée de façon à prendre en charge les environnements AOT, les types et les membres non publics, ainsi que les types et membres en lecture seule.
Migrez vers MessagePack (binaire).
Binaire à l’aide de protobuf-net
La bibliothèque protobuf-net est un sérialiseur basé sur contrat pour .NET qui utilise le format binaire des mémoires tampons de protocoleserialization. L’API suit des modèles .NET classiques, et est globalement comparable à XmlSerializer
et DataContractSerializer
. Cette bibliothèque populaire est également riche en fonctionnalités et peut gérer des types et des champs non publics, mais de nombreux scénarios nécessitent l’application d’attributs aux membres.