Windows Forms migreringsguide för BinaryFormatter
BinaryFormatter borttagning
Från och med .NET 9 BinaryFormatter stöds inte längre på grund av dess kända säkerhetsrisker och dess API:er genererar alltid en PlatformNotSupportedException för alla projekttyper, inklusive Windows Forms appar. Mer information om riskerna BinaryFormatter och orsaken till borttagningen finns i migreringsguidenBinaryFormatter.
Vid BinaryFormatterborttagningen förväntas många Windows Forms program påverkas och du måste vidta åtgärder för att slutföra migreringen till .NET 9 eller en senare version.
Hur BinaryFormatter påverkar Windows Forms
Före .NET 9 Windows Forms används BinaryFormatter för att serialisera och deserialisera data för scenarier som Urklipp, dra och släpp och lagra eller läsa in resurser vid designtillfället. Från och med .NET 9 Windows Forms använder WPF en delmängd av implementeringen BinaryFormatter internt för dessa scenarier. Även om BinaryFormatterrisker inte kan hanteras i generell serialisering/deserialisering, har åtgärder vidtagits för att minska riskerna i dessa mycket specifika användningsfall med en känd uppsättning typer. En återställning till BinaryFormatter finns fortfarande för okända eller typer som inte stöds, vilket utlöser undantag om inte migreringsåtgärder vidtas i programmet.
Windows Forms och WPF-appar hanterar båda följande typer, tillsammans med matriser och listor av dessa typer. Resurser för urklipp, dra och släpp och designtid fortsätter att fungera med dessa typer utan att det behövs några migreringssteg.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms stöder också följande ytterligare typer:
OLE-scenarier
Information om vilka effekter BinaryFormatter borttagningen har på OLE-scenarier som Urklipp och dra och släpp samt vägledning för migrering finnsWindows Forms i och OLE-vägledning för Windows Presentation FoundationBinaryFormatter.
Resurser (ResX)
Designern Windows Forms
Out-of-Process Windows Forms Designer använder BinaryFormatter också internt för ResX-serialisering och deserialisering.
Typer och egenskaper kan delta i serialisering utan att du inser det på grund av designerns Windows Forms standardbeteende. Ett sätt som BinaryFormatter används som du kanske inte känner till är när en public
egenskap på en IComponent introduceras och den egenskapen fylls i eller redigeras vid designtillfället. Egenskapen serialiseras i resursfiler under följande villkor:
- En offentlig egenskap innehåller data när en Form i designern sparas.
- Den egenskapen är inte skrivskyddad.
- Den egenskapen tillskrivs
[DesignerSerializationVisibility(false)]
inte . - Den egenskapen har DefaultValueAttributeingen .
- Den egenskapen har ingen respektive
bool ShouldSerialize[PropertyName]
metod som returnerasfalse
vid tidpunkten för CodeDOM-serialiseringsprocessen. (Obs! metoden kan haprivate
omfång.) - Den egenskapen är en typ som inte har en DesignerSerializer
Om dessa instruktioner är sanna avgör designern om egenskapens typ har en typkonverterare. Om den gör det använder designern typkonverteraren för att serialisera egenskapsinnehållet. Annars används BinaryFormatter det för att serialisera innehållet till resursfilen. Windows Forms har lagt till analysverktyg tillsammans med kodkorrigeringar för att öka medvetenheten om den här typen av beteende där BinaryFormatter serialisering kan ske utan utvecklarens vetskap.
Läser in resurs under körning
Typer som tidigare serialiserats till resursfiler via BinaryFormatter fortsätter att deserialiseras som förväntat utan att behövas BinaryFormatter eftersom innehållet i ResX-filer betraktas som betrodda data. I sällsynta fall kan deserialisering inte ske utan BinaryFormatter, kan den läggas tillbaka med ett kompatibilitetspaket som inte stöds. Mer information finns i migreringsguiden BinaryFormatter : Kompatibilitetspaket . Observera att ett extra steg för att ställa in System.Resources.Extensions.UseBinaryFormatter
appkontextväxling true
krävs för att använda BinaryFormatter för resurser.
Generera resursfiler via msbuild
När du genererar resursfiler via msbuild kan det uppstå ett MSB3825
fel som anger att dina binära formaterade resurser kan deserialiseras med hjälp av BinaryFormatter under körningen. Som nämnts ovan kommer dessa resurser inte att deserialisera med hjälp av BinaryFormatter och den här varningen kan inaktiveras genom att ställa in egenskapen GenerateResourceWarnOnBinaryFormatterUse
på false
. I sällsynta fall kan deserialisering inte ske utan BinaryFormatter, det kan läggas tillbaka med ett kompatibilitetspaket som inte stöds. Mer information finns i migreringsguiden BinaryFormatter : Kompatibilitetspaket . Observera att ytterligare ett steg för att ställa in System.Resources.Extensions.UseBinaryFormatter
appkontextväxling true
krävs för att använda BinaryFormatter för resurser.
Migrera bort från BinaryFormatter
Om typer som inte hanteras i sig under serialisering och deserialisering används i de berörda scenarierna måste du vidta åtgärder för att slutföra migreringen till .NET 9 eller en senare version.
OLE-scenarier
Mer Windows Forms information om hur du migrerar bort från BinaryFormatter scenarier som Urklipp och dra och släpp finns i ole-vägledningen för Windows Presentation FoundationBinaryFormatter.
Läsa in och spara resurser under designtiden
För typer som inte hanteras i sig under serialiseringen till resurser, till exempel när det gäller Designer med ResX-scenarier, är det föreskrivna sättet att migrera bort från BinaryFormatter att se till att en TypeConverter
är registrerad för den typ eller egenskap som deltar i serialisering. På så sätt används under serialisering och deserialisering TypeConverter
i stället för där BinaryFormatter användes en gång. Mer information om hur du implementerar en typkonverterare finns i TypeConverter
Klass.
Kompatibilitetslösning (rekommenderas inte)
.NET 9-användare som inte kan migrera bort från BinaryFormatter kan installera ett kompatibilitetspaket som inte stöds. Mer information finns i migreringsguide BinaryFormatter : Kompatibilitetspaket.
Varning
BinaryFormatter är farligt och rekommenderas inte eftersom det utsätter användning av appar för risk för attacker som DoS (Denial of Service), avslöjande av information eller fjärrkörning av kod. Mer information om riskerna BinaryFormatter finns i Deserialiseringsrisker vid användning av BinaryFormatter och relaterade typer.
Problem
Om du upplever ett oväntat beteende med din Windows Forms app när det gäller BinaryFormatter serialisering eller deserialisering kan du ange ett problem på github.com/dotnet/winforms och ange att problemet är relaterat till borttagningen av BinaryFormatter.