Les API de sérialisation de BinaryFormatter produisent des erreurs du compilateur
Dans le cadre du plan de dépréciation à long terme de BinaryFormatter, nous continuons à retirer les fonctionnalités BinaryFormatter
de nos bibliothèques et détourner les développeurs de l’utilisation du type. À compter de .NET 7, les appels aux API suivantes produisent des erreurs de compilation pour tous les types de projet C# et Visual Basic :
- ÉvénementSystem.Exception.SerializeObjectState
- Méthode BinaryFormatter.Serialize
- Méthode BinaryFormatter.Deserialize
- Méthode Formatter.Serialize(Stream, Object)
- Méthode Formatter.Deserialize(Stream)
- Méthode IFormatter.Serialize(Stream, Object)
- Méthode IFormatter.Deserialize(Stream)
Comportement précédent
Depuis .NET 5, l’utilisation des méthodes Serialize
et Deserialize
affectées produisait un avertissement du compilateur avec l’ID SYSLIB0011
. Pour plus d’informations, consultez Les méthodes de sérialisation de BinaryFormatter sont obsolètes et interdites dans les applications ASP.NET (.NET 5).
L’utilisation de l’événement Exception.SerializeObjectState ne produisait pas d’erreur.
Nouveau comportement
À compter de .NET 7, l’utilisation d’une des API affectées dans le code produit une erreur de compilateur avec le même ID, SYSLIB0011
. Votre projet sera affecté s’il répond à tous les critères suivants :
- C’est un projet C# ou Visual Basic.
- Il cible
net7.0
ou ultérieur. - Il appelle directement une des API affectées.
- Il ne supprime pas déjà le code d’avertissement
SYSLIB0011
.
Version introduite
.NET 7
Type de changement cassant
Ce changement peut affecter la compatibilité source.
Raison du changement
Dans le cadre du plan de dépréciation à long terme de BinaryFormatter, nous continuons à retirer les fonctionnalités BinaryFormatter
de nos bibliothèques et détourner les développeurs de l’utilisation du type.
Action recommandée
La meilleure solution consiste à cesser d’utiliser BinaryFormatter
en raison de ses défauts de sécurité et de fiabilité. BinaryFormatter
est susceptible d’être supprimé de .NET dans une version future. L’équipe des bibliothèques .NET a déjà indiqué que les types récents comme System.Half et System.DateOnly ne seront pas compatibles avec BinaryFormatter
.
Si vous devez supprimer les erreurs, vous pouvez le faire en suivant les instructions de l’article d’origine sur l’obsolescence. Vous pouvez aussi désactiver l’erreur à l’échelle du projet en définissant une propriété de projet qui reconvertit l’erreur en avertissement (pour correspondre au comportement de .NET 5/6).
Avertissement
La définition de cette propriété peut modifier le comportement de l’hôte. Consultez <EnableUnsafeBinaryFormatterSerialization>, propriété.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Notes
Si votre projet est compilé avec « avertissements en tant qu’erreurs » activé, la compilation va néanmoins toujours échouer. (Ceci correspond au comportement des SDK .NET 5 et .NET 6.) Si c’est le cas, vous devez toujours supprimer l’avertissement SYSLIB0011
dans la source ou dans l’élément <NoWarn>
de votre fichier projet.
<EnableUnsafeBinaryFormatterSerialization>, propriété
La propriété <EnableUnsafeBinaryFormatterSerialization
a été introduite dans .NET 5. Avec .NET 7, le comportement de ce commutateur a changé pour contrôler à la fois le comportement de compilation et d’exécution de l’hôte. La signification de ce commutateur diffère en fonction du type de projet, comme décrit dans le tableau suivant.
Type de projet | Propriété définie sur true |
Propriété définie sur false |
Propriété omise |
---|---|---|---|
Bibliothèque/composant partagé1 | Les API affectées sont obsolètes en tant qu’avertissement. La compilation réussit, sauf si vous avez activé les « avertissements en tant qu’erreurs » pour votre application ou si vous avez supprimé le code d’avertissement SYSLIB0011 . |
Les API affectées sont obsolètes en tant qu’erreur, et les appels de votre code à ces API échouent au moment de la compilation, sauf si l’erreur est supprimée. | (Idem que pour false .) |
Applications Blazor et MAUI2 | Les appels à BinaryFormatter vont échouer au moment de l’exécution. |
Les appels à BinaryFormatter vont échouer au moment de l’exécution. |
Les appels à BinaryFormatter vont échouer au moment de l’exécution. |
Application ASP.NET | Les API affectées sont obsolètes en tant qu’avertissement. La compilation réussit, sauf si vous avez activé les « avertissements en tant qu’erreurs » pour votre application ou si vous avez supprimé le code d’avertissement SYSLIB0011 . Le runtime autorise les appels à BinaryFormatter , que l’appel provienne de votre code ou d’une dépendance que vous consommez. |
Les API affectées sont obsolètes en tant qu’erreur, et les appels de votre code à ces API échouent au moment de la compilation, sauf si l’erreur est supprimée. Le runtime interdit les appels à BinaryFormatter , que l’appel provienne de votre code ou d’une dépendance que vous consommez. |
(Idem que pour false .) |
Applications de bureau et tous les autres types d’applications | Les API affectées sont obsolètes en tant qu’avertissement. La compilation réussit, sauf si vous avez activé les « avertissements en tant qu’erreurs » pour votre application ou si vous avez supprimé le code d’avertissement SYSLIB0011 . Le runtime autorise les appels à BinaryFormatter , que l’appel provienne de votre code ou d’une dépendance que vous consommez. |
Les API affectées sont obsolètes en tant qu’erreur, et les appels de votre code à ces API échouent au moment de la compilation, sauf si l’erreur est supprimée. Le runtime interdit les appels à BinaryFormatter , que l’appel provienne de votre code ou d’une dépendance que vous consommez. |
Les API affectées sont obsolètes en tant qu’erreur, et les appels de votre code à ces API échouent au moment de la compilation, sauf si l’erreur est supprimée. Le runtime autorise les appels à BinaryFormatter , que l’appel provienne de votre code ou d’une dépendance que vous consommez. |
1La stratégie d’exécution est contrôlée par l’hôte de l’application. Les appels à BinaryFormatter
peuvent toujours échouer au moment de l’exécution, même si <EnableUnsafeBinaryFormatterSerialization>
est défini sur true
dans le fichier projet de votre bibliothèque. Les bibliothèques ne peuvent pas remplacer la stratégie d’exécution de l’hôte d’application.
2Les runtimes Blazor et MAUI interdisent les appels à BinaryFormatter
. Quelle que soit la valeur que vous définissez pour <EnableUnsafeBinaryFormatterSerialization>
, les appels échouent au moment de l’exécution. N’appelez pas ces API depuis des applications Blazor ou MAUI, ou depuis des bibliothèques destinées à être consommées par des applications Blazor ou MAUI.
API affectées
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)