Guide de migration de Windows Presentation Foundation (WPF) pour BinaryFormatter
Suppression de BinaryFormatter
À partir de .NET 9, BinaryFormatter n'est plus pris en charge en raison des risques de sécurité connus qu'il présente et ses API lèvent toujours une exception PlatformNotSupportedException pour tous les types de projets, y compris les applications WPF. Pour plus d'informations sur les risques posés par BinaryFormatter et la raison de sa suppression, voir le guide de migration de BinaryFormatter.
Avec la suppression de BinaryFormatter, on peut prévoir que de nombreuses applications WPF seront impactées, et vous devrez faire le nécessaire pour migrer vers .NET 9 ou une version ultérieure.
Comment BinaryFormatter affecte WPF
Avant .NET 9, Windows Presentation Foundation (WPF) utilisait BinaryFormatter pour sérialiser et désérialiser les données pour des scénarios tels que le Presse-papiers, le glisser-déposer et le chargement/stockage de l'état dans le Journal. Depuis .NET 9,, WPF et Windows Forms utilisent un sous-ensemble de l’implémentation de BinaryFormatter en interne pour ces scénarios. Bien que les risques liés à BinaryFormatter ne puissent pas être traités dans la sérialisation/désérialisation générale, des mesures ont été prises pour atténuer les risques dans ces cas d'utilisation très spécifiques avec un ensemble connu de types. Un repli sur BinaryFormatter reste possible pour les types inconnus ou non pris en charge, ce qui lève une PlatformNotSupportedException, à moins qu'une migration ne soit mise en œuvre dans l'application.
Les applications WPF et WinForms gèrent les types ci-après, ainsi que les tableaux et listes de ces types. Le Presse-papiers, le glisser-déposer et la liaison Avalon dans le Journal continueront de fonctionner avec ces types sans aucune opération de migration nécessaire.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Scénarios OLE
Pour plus d'informations sur les effets de la suppression de BinaryFormatter sur les scénarios OLE tels que le Presse-papiers et le glisser-déposer, et obtenir des instructions pour migrer, voir la page Windows Forms and Windows Presentation Foundation BinaryFormatter OLE guidance.
Vous pouvez vous référer à la fonction dans laquelle nous avons utilisé BinaryFormatter comme solution de repli pour lire/enregistrer un objet à gérer : SaveObjectToHandle et ReadObjectFromHandle pour les scénarios OLE.
Journalisation
Cas de figure dans lequel nous avons besoin de stocker ou de charger un état lors de la gestion de l'historique de navigation dans WPF.
Pour charger/enregistrer, nous appelons LoadSubStreams/ SaveSubStreams de la classe DataStream
. Si l'élément utilisé ne fait pas partie d'un type connu géré par la nouvelle implémentation, il utilisera BinaryFormatter.
Lorsqu’un développeur navigue via JournalEntry à l’aide Navigate
de , GoForward
ou GoBack
, les données du nœud sont chargées ou enregistrées dans un flux pour enregistrer l’état. Si le type impliqué n’est pas intrinsèquement géré lors de la sérialisation/désérialisation, BinaryFormatter est utilisé.
Réf. : DataStream.cs
Solution de contournement de compatibilité (non recommandée)
Les utilisateurs .NET 9 qui ne peuvent pas faire sans BinaryFormatter peuvent installer un package de compatibilité non pris en charge. Pour plus d’informations, voir le guide de migration BinaryFormatter, page Compatibility Package.
Attention
BinaryFormatter est dangereux et non recommandé, car il expose les applications consommatrices à des risques d’attaques, notamment par déni de service (DoS), divulgation d’informations ou encore exécution de code à distance. Pour plus d'informations sur les risques posés par BinaryFormatter, voir la page Deserialization risks in use of BinaryFormatter and related types.
Problèmes
Si vous rencontrez un comportement inattendu sur votre application WPF application en lien avec BinaryFormatter, rapportez le problème sur dotnet/wpf/issues en précisant qu'il est lié à la suppression de BinaryFormatter.