Migrer vers MessagePack (binaire)
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.
Certains comportements et certaines fonctionnalités de MessagePack pour C# seront notables pendant des migrations à partir de BinaryFormatter, surtout si des modifications aux API des types sérialisés ne peuvent pas être apportées ou doivent être minimisées.
Par défaut, seuls les types publics sont sérialisables. Les classes et structs internes et privés peuvent être sérialisés uniquement quant
StandardResolverAllowPrivate.Options
est fourni comme argument aux méthodesMessagePackSerializer.Serialize
etMessagePackSerializer.Deserialize
.MessagePack nécessite l’annotation de chaque type sérialisable avec l’attribut
[MessagePackObject]
. Il est possible de l’éviter en utilisant le ContractlessStandardResolver, mais il est possible qu’il entraîne des problèmes de contrôle de version à l’avenir.Chaque propriété et champ non statique sérialisable doit être annotée avec l’attribut
[Key]
. Si vous annotez le type avec l’attribut[MessagePackObject(keyAsPropertyName: true)]
, les membres ne nécessitent pas d’annotation explicite. Dans ce cas, utilisez l’attribut[IgnoreMember]
pour ignorer certains membres publics.Pour sérialiser des membres privés, utilisez StandardResolverAllowPrivate.
Les annotations
System.Runtime.Serialization
peuvent être utilisées à la place des annotations MessagePack :[DataContract]
au lieu de[MessagePackObject]
,[DataMember]
au lieu de[Key]
et[IgnoreDataMember]
au lieu de[IgnoreMember]
. Ces annotations peuvent être utiles si vous souhaitez éviter une dépendance sur MessagePack dans la bibliothèque qui définit des types sérialisables.Elles prennent en charge les membres et les types readonly/immuable. Le sérialiseur essaye d’utiliser le constructeur public avec la liste des meilleurs arguments correspondants. Le constructeur peut être spécifié de manière explicite en utilisant l’attribut
[SerializationConstructor]
.Serialization des types arbitraires sont pris en charge via des formateurs personnalisés qui sont simples à créer. Cela permet de supprimer toutes les exigences pour les attributs et les modèles de membre ou de constructeur spécifiques.
Le sérialiseur prend en charge les collections et les types intégrés les plus fréquemment utilisés fournis par les bibliothèques de classe de base .NET. Vous trouverez la liste complète dans les documents officiels. Il a des points d’extension permettant la personnalisation.
Avertissement
MessagePack a des API permettant la sérialisation de données sans les restrictions de type. Selon les Notes relatives à la sécurité sur MessagePack, ces API doivent être évitées.
Avertissement
Certaines API MessagePack ont un comportement personnalisable via des statiques mutables, ce qui signifie que votre code peut réussir ou échouer en fonction de ce qu’effectue un autre code, AssemblyLoadContext ou AppDomain, dans le même processus. Vous pouvez maintenir votre code résilient en faisant également référence au package MessagePackAnalyzer et en activant les analyseurs MsgPack001 et MsgPack002 qui appellent les utilisations des API avec un comportement modifiable.