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 :

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.

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

Voir aussi