Windows Forms migratiehandleiding voor BinaryFormatter
BinaryFormatter verwijdering
Vanaf .NET 9 wordt dit BinaryFormatter niet meer ondersteund vanwege de bekende beveiligingsrisico's en de BIJBEHORENDE API's worden altijd gebruikt PlatformNotSupportedException voor alle projecttypen, inclusief Windows Forms apps. Zie deBinaryFormatterBinaryFormatter voor meer informatie over de risico's en de reden voor het verwijderen ervan.
Bij BinaryFormatterhet verwijderen wordt verwacht dat veel Windows Forms toepassingen worden beïnvloed en dat u actie moet ondernemen om uw migratie naar .NET 9 of een latere versie te voltooien.
Hoe BinaryFormatter is dit van invloed op Windows Forms
Voordat .NET 9 werd Windows Forms gebruikt BinaryFormatter voor het serialiseren en deserialiseren van gegevens voor scenario's zoals klembord, slepen en neerzetten en het opslaan of laden van resources tijdens het ontwerp. Vanaf .NET 9 Windows Forms en WPF wordt een subset van de BinaryFormatter implementatie intern gebruikt voor deze scenario's. Hoewel BinaryFormatterde risico's niet kunnen worden aangepakt in serialisatie/deserialisatie voor algemeen gebruik, zijn er maatregelen genomen om de risico's in deze zeer specifieke gebruiksscenario's met een bekende set typen te beperken. Er is nog steeds een terugval van toepassing op onbekende of niet-ondersteunde BinaryFormatter typen, waardoor uitzonderingen worden veroorzaakt, tenzij er migratiestappen worden uitgevoerd in de toepassing.
Windows Forms en WPF-apps verwerken beide de volgende typen, samen met matrices en lijsten van deze typen. Klembord, slepen en neerzetten en ontwerptijdbronnen blijven werken met deze typen zonder dat er migratiestappen nodig zijn.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms ondersteunt ook de volgende extra typen:
OLE-scenario's
Voor informatie over de effecten BinaryFormatter die het verwijderen heeft op OLE-scenario's zoals klembord en slepen en neerzetten, evenals migratierichtlijnen, zie BinaryFormatter voor Windows Presentation Foundation.
Resources (ResX)
De Windows Forms ontwerpfunctie
De Windows Forms Out-Of-Process Designer gebruikt BinaryFormatter ook intern voor ResX-serialisatie en deserialisatie.
Typen en eigenschappen kunnen deelnemen aan serialisatie zonder dat u zich realiseert vanwege het standaardgedrag van de Windows Forms ontwerper. Een manier waarop BinaryFormatter u zich misschien niet bewust bent, is wanneer een public
eigenschap op een IComponent wordt geïntroduceerd en die eigenschap wordt gevuld of bewerkt tijdens het ontwerp. Deze eigenschap wordt onder de volgende voorwaarden geserialiseerd in resourcebestanden:
- Een openbare eigenschap bevat gegevens op het moment dat een Form in de ontwerpfunctie wordt opgeslagen.
- Deze eigenschap is niet alleen-lezen.
- Die eigenschap is niet toegeschreven aan
[DesignerSerializationVisibility(false)]
. - Die eigenschap heeft DefaultValueAttributegeen .
- Deze eigenschap heeft geen respectieve
bool ShouldSerialize[PropertyName]
methode die wordt geretourneerdfalse
op het moment van het serialisatieproces van CodeDOM. (Opmerking: de methode kan een bereik hebbenprivate
.) - Deze eigenschap is een type dat geen DesignerSerializer
Als deze instructies waar zijn, bepaalt de ontwerper of het type van die eigenschap een typeconversieprogramma heeft. Als dit het geval is, gebruikt de ontwerper het typeconversieprogramma om de eigenschapsinhoud te serialiseren. Anders wordt BinaryFormatter de inhoud in het resourcebestand geserialiseerd. Windows Forms heeft analyses toegevoegd, samen met codecorrecties om bewustzijn te brengen in dit type gedrag waarbij BinaryFormatter serialisatie kan plaatsvinden zonder dat de ontwikkelaar hiervan op de hoogte is.
Resource laden tijdens runtime
Typen die eerder in resourcebestanden BinaryFormatter waren geserialiseerd, blijven zoals verwacht deserialiseren zonder dat BinaryFormatter de inhoud van ResX-bestanden als vertrouwde gegevens wordt beschouwd. In het zeldzame geval dat deserialisatie niet kan optreden zonder BinaryFormatter, kan het worden toegevoegd met een niet-ondersteund compatibiliteitspakket. Zie BinaryFormatter de migratiehandleiding: Compatibiliteitspakket voor meer informatie. Houd er rekening mee dat een extra stap voor het instellen System.Resources.Extensions.UseBinaryFormatter
van app-context moet true
worden gebruikt BinaryFormatter voor resources.
Resourcebestanden genereren via msbuild
Bij het genereren van resourcebestanden via msbuild kan er een MSB3825
fout optreden die aangeeft dat uw binaire geformatteerde resources tijdens runtime gedeserialiseerd BinaryFormatter kunnen worden. Zoals hierboven vermeld, worden deze resources niet gedeserialiseerd met behulp van BinaryFormatter deze waarschuwing en kan deze waarschuwing worden uitgeschakeld door de eigenschap GenerateResourceWarnOnBinaryFormatterUse
in te stellen op false
. In zeldzame gevallen dat deserialisatie niet kan optreden zonder BinaryFormatter, kan het worden toegevoegd met een niet-ondersteund compatibiliteitspakket. Zie BinaryFormatter de migratiehandleiding: Compatibiliteitspakket voor meer informatie. Houd er rekening mee dat een extra stap voor het instellen System.Resources.Extensions.UseBinaryFormatter
van app-context moet worden true
gebruikt BinaryFormatter voor resources.
Migreren weg van BinaryFormatter
Als typen die niet intrinsiek worden verwerkt tijdens serialisatie en deserialisatie worden gebruikt in de betrokken scenario's, moet u actie ondernemen om de migratie naar .NET 9 of een latere versie te voltooien.
OLE-scenario's
Zie BinaryFormatter voor Windows Presentation Foundation voor meer informatie over hoe u kunt migreren BinaryFormatter in scenario's zoals klembord en slepen en neerzetten.
Resources laden en besparen tijdens de ontwerptijd
Voor typen die niet intrinsiek worden verwerkt tijdens serialisatie in resources, zoals in het geval van designer met ResX-scenario's, is de voorgeschreven manier om weg BinaryFormatter te migreren ervoor te zorgen dat een TypeConverter
is geregistreerd voor het type of de eigenschap die deelneemt aan serialisatie. Op deze manier wordt tijdens serialisatie en deserialisatie het TypeConverter
gebruikt in plaats van waar BinaryFormatter ooit is gebruikt. Zie TypeConverter
Klasse voor meer informatie over het implementeren van een typeconversieprogramma.
Tijdelijke compatibiliteit (niet aanbevolen)
.NET 9-gebruikers die niet kunnen migreren BinaryFormatter , kunnen een niet-ondersteund compatibiliteitspakket installeren. Zie BinaryFormatter de migratiehandleiding: Compatibiliteitspakket voor meer informatie.
Let op
BinaryFormatter is gevaarlijk en wordt niet aanbevolen omdat het het gebruik van apps in gevaar brengt voor aanvallen zoals Denial of Service (DoS), openbaarmaking van informatie of uitvoering van externe code. Zie Deserialisatierisico's die worden gebruikt en gerelateerde typenBinaryFormatter.
Problemen
Als u onverwacht gedrag ondervindt met uw Windows Forms-app met betrekking tot BinaryFormatter serialisatie of deserialisatie, dient u een probleem op github.com/dotnet/winforms in en geeft u aan dat het probleem te maken heeft met het verwijderen van BinaryFormatter.