Delen via


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.

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 geretourneerd false op het moment van het serialisatieproces van CodeDOM. (Opmerking: de methode kan een bereik hebben private .)
  • 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.

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