Dela via


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.

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 returneras false vid tidpunkten för CodeDOM-serialiseringsprocessen. (Obs! metoden kan ha private 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 GenerateResourceWarnOnBinaryFormatterUsefalse. 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.

.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.