Guide de migration de Windows Forms 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 Windows Forms. 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 Windows Forms soient impactées, et vous devrez faire le nécessaire pour migrer vers .NET 9 ou une version ultérieure.
Comment BinaryFormatter affecte Windows Forms
Avant .NET 9, Windows Forms 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 stockage ou le chargement de ressources au moment du design. Depuis .NET 9, Windows Forms et WPF 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 des exceptions, à moins qu'une migration ne soit mise en œuvre dans l'application.
Les applications Windows Forms et WPF gèrent les types ci-après, ainsi que les tableaux et listes de ces types. Le Presse-papiers, le glisser-déposer et les ressources au moment du design continueront de fonctionner avec ces types sans 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
Windows Forms prend également en charge les types supplémentaires suivants :
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.
Resources (ResX)
Le Concepteur Windows Forms
Le Concepteur hors processus Windows Forms utilise également BinaryFormatter en interne pour la sérialisation et la désérialisation ResX.
Les types et les propriétés peuvent participer à la sérialisation sans que vous vous en rendiez compte en raison du comportement standard du Concepteur Windows Forms. L'une des utilisations de BinaryFormatter dont vous n'êtes peut-être pas conscient est l'introduction d'une propriété public
sur un IComponent, qui est renseignée ou modifiée au moment du design. Cette propriété est sérialisée dans des fichiers de ressources dans les conditions suivantes :
- Une propriété publique contient des données au moment de l'enregistrement d'un Form dans le Concepteur.
- Cette propriété n’est pas en lecture seule.
- Cette propriété n’est pas attribuée avec
[DesignerSerializationVisibility(false)]
. - Cette propriété n'a pas d'attribut DefaultValueAttribute.
- Cette propriété n'a pas de méthode
bool ShouldSerialize[PropertyName]
qui renvoiefalse
au moment du processus de sérialisation du CodeDOM. (Remarque : la méthode peut avoir une étendueprivate
). - Cette propriété est un type qui n’a pas de DesignerSerializer.
Si ces conditions sont vérifiées, le Concepteur détermine si le type de cette propriété a un convertisseur de type. Si c’est le cas, le Concepteur utilise le convertisseur de type pour sérialiser le contenu de la propriété. Sinon, il utilise BinaryFormatter pour sérialiser le contenu dans le fichier de ressources. Windows Forms a ajouté des analyseurs aux côtés des correctifs de code pour aider à sensibiliser à ce type de comportement où la sérialisation BinaryFormatter peut se produire à l'insu du développeur.
Chargement de la ressource pendant l’exécution
Les types précédemment sérialisés dans des fichiers de ressources via BinaryFormatter continuent à se désérialiser comme prévu sans avoir besoin de BinaryFormatter, le contenu des fichiers ResX étant considéré comme du contenu de confiance. Dans les rares cas où la désérialisation ne peut pas se faire sans BinaryFormatter, son rajout est possible avec un package de compatibilité non pris en charge. Pour plus d'informations, voir le guide de migration de BinaryFormatter, page Compatibility Package. Notez qu'une étape supplémentaire, consistant à définir le commutateur de contexte System.Resources.Extensions.UseBinaryFormatter
sur true
est nécessaire pour utiliser BinaryFormatter pour les ressources.
Création de fichiers de ressources via msbuild
Lors de la création de fichiers de ressources via msbuild, vous pouvez rencontrer une erreur MSB3825
qui indique que vos ressources au format binaire peuvent être désérialisées à l’aide de BinaryFormatter pendant le runtime. Comme indiqué ci-dessus, ces ressources ne vont pas désérialiser à l’aide de BinaryFormatter et cet avertissement peut être désactivé en définissant la propriété GenerateResourceWarnOnBinaryFormatterUse
sur false
. Dans les rares cas où la désérialisation ne peut pas se faire sans BinaryFormatter, son rajout est possible avec un package de compatibilité non pris en charge. Pour plus d'informations, voir le guide de migration de BinaryFormatter, page Compatibility Package. Notez qu'une étape supplémentaire, consistant à définir le commutateur de contexte de l'application System.Resources.Extensions.UseBinaryFormatter
sur true
est nécessaire pour utiliser BinaryFormatter pour les ressources.
Faire sans BinaryFormatter
Si des types qui ne sont pas intrinsèquement gérés lors de la sérialisation et la désérialisation sont utilisés dans les scénarios affectés, vous devrez faire le nécessaire pour migrer vers .NET 9 ou une version ultérieure.
Scénarios OLE
Voir la page Windows Forms and Windows Presentation Foundation BinaryFormatter OLE guidance pour plus d’informations sur la façon de faire sans BinaryFormatter dans des scénarios tels que le Presse-papiers et le glisser-déposer.
Chargement et enregistrement des ressources au moment du design
Pour les types qui ne sont pas intrinsèquement gérés lors de la sérialisation dans les ressources, comme dans le cas des scénarios Designer with ResX, la manière prescrite de faire sans BinaryFormatter consiste à s’assurer qu’un TypeConverter
est enregistré pour le type ou la propriété qui participe à la sérialisation. Ainsi, lors de la sérialisation et de la désérialisation, le TypeConverter
est utilisé en lieu et place de BinaryFormatter. Pour plus d’informations sur l’implémentation d’un convertisseur de type, voir TypeConverter
Class.
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 Windows Forms en lien avec la sérialisation ou la désérialisation BinaryFormatter, rapportez le problème sur github.com/dotnet/winformswinforms en précisant qu'il est lié à la suppression de BinaryFormatter.