Sdílet prostřednictvím


Windows Forms průvodce migrací pro BinaryFormatter

BinaryFormatter odstranění

Počínaje rozhraním .NET 9 BinaryFormatter se už nepodporuje kvůli známým rizikům zabezpečení a rozhraní API vždy můžou vyvolat PlatformNotSupportedException výjimku pro všechny typy projektů, včetně Windows Forms aplikací. Další informace o rizicích BinaryFormatter a důvodech jeho odebrání najdete v BinaryFormatter průvodci migrací.

Při BinaryFormatterodebrání se očekává, že bude ovlivněno mnoho Windows Forms aplikací a budete muset provést akci k dokončení migrace na .NET 9 nebo novější verzi.

Jak BinaryFormatter ovlivňuje Windows Forms

Před .NET 9 se Windows Forms používá BinaryFormatter k serializaci a deserializaci dat pro scénáře, jako je schránka, přetažení a ukládání nebo načítání prostředků v době návrhu. Počínaje rozhraním .NET 9 Windows Forms a WPF pro tyto scénáře interně používají podmnožinu BinaryFormatter implementace. I když BinaryFormatterrizika nelze řešit při serializaci/deserializaci pro obecné účely, byla přijata opatření ke zmírnění rizik v těchto velmi specifických případech použití se známou sadou typů. BinaryFormatter Pro neznámé nebo nepodporované typy se stále používá náhradní řešení, které vyvolá výjimky, pokud se v aplikaci neprovedou kroky migrace.

Windows Forms aplikace WPF také zpracovávají následující typy spolu s poli a seznamy těchto typů. Prostředky s schránkou, přetažením a časem návrhu budou s těmito typy dál pracovat bez nutnosti jakýchkoli kroků migrace.

Windows Forms podporuje také následující další typy:

Scénáře OLE

Informace o odebrání efektů BinaryFormatter jsou uvedené ve scénářích OLE, jako je schránka a přetažení, a pokyny k migraci naleznete v tématu Windows Forms a pokyny k technologii OLE služby Windows Presentation FoundationBinaryFormatter.

Zdroje (ResX)

Návrhář Windows Forms

Windows Forms Návrhář mimo proces také používá BinaryFormatter interně pro serializaci a deserializaci ResX.

Typy a vlastnosti se mohou účastnit serializace, aniž byste si uvědomili, že je to kvůli standardnímu chování Návrháře Windows Forms . Jedním ze způsobů, jak BinaryFormatter se používá, není nutné vědět, je to, když public je vlastnost na objektu IComponent zavedená a tato vlastnost je naplněna nebo upravena v době návrhu. Tato vlastnost je serializována do souborů prostředků za následujících podmínek:

  • Veřejná vlastnost obsahuje data v době, kdy Form je uložen v Návrháři.
  • Tato vlastnost není určena jen pro čtení.
  • Tato vlastnost není přiřazena [DesignerSerializationVisibility(false)].
  • Tato vlastnost nemá hodnotu DefaultValueAttribute.
  • Tato vlastnost nemá odpovídající bool ShouldSerialize[PropertyName] metodu, která vrací false v době procesu serializace CodeDOM. (Poznámka: Metoda může mít private obor.)
  • Tato vlastnost je typ, který nemá DesignerSerializer

Pokud jsou tyto příkazy pravdivé, Návrhář určí, zda typ této vlastnosti má převaděč typů. Pokud ano, Návrhář používá převaděč typů k serializaci obsahu vlastnosti. V opačném případě se použije BinaryFormatter k serializaci obsahu do souboru prostředků. Windows Forms přidal analyzátory spolu s opravami kódu, které pomáhají zvýšit povědomí o tomto typu chování, kdy BinaryFormatter se serializace může vyskytovat bez znalosti vývojáře.

Načítání prostředku za běhu

Typy, které byly dříve serializovány do souborů prostředků prostřednictvím BinaryFormatter , budou nadále deserializovat podle očekávání, aniž by bylo nutné BinaryFormatter , protože obsah souborů ResX jsou považovány za důvěryhodná data. Ve výjimečných případech, kdy deserializace nemůže nastat bez BinaryFormatter, lze jej přidat zpět s nepodporovaným balíčkem kompatibility. Podrobnosti najdete BinaryFormatter v průvodci migrací: Balíček kompatibility. Všimněte si, že pro prostředky se vyžaduje BinaryFormatter další krok nastavení System.Resources.Extensions.UseBinaryFormatter kontextového přepínače true aplikace.

Generování souborů prostředků prostřednictvím nástroje msbuild

Při generování souborů prostředků prostřednictvím nástroje msbuild může dojít k MSB3825 chybě, která určuje, že binární formátované prostředky mohou být deserializovány pomocí BinaryFormatter modulu runtime. Jak je uvedeno výše, tyto prostředky nebudou deserializovat pomocí BinaryFormatter a toto upozornění lze vypnout nastavením vlastnosti GenerateResourceWarnOnBinaryFormatterUse na false. Ve výjimečných případech, kdy deserializace nemůže nastat bez BinaryFormatter, lze ji přidat zpět s nepodporovaným balíčkem kompatibility. Podrobnosti najdete BinaryFormatter v průvodci migrací: Balíček kompatibility. Všimněte si, že pro prostředky se vyžaduje BinaryFormatter další krok nastavení System.Resources.Extensions.UseBinaryFormatter kontextového přepínače true aplikace.

Migrace mimo BinaryFormatter

Pokud se v ovlivněných scénářích používají typy, které nejsou vnitřně zpracovávány během serializace a deserializace, budete muset provést akci k dokončení migrace na .NET 9 nebo novější verzi.

Scénáře OLE

Další Windows Forms informace o tom, jak migrovat mimo BinaryFormatter scénáře, jako je schránka a přetažení, najdete v pokynech OLE služby Windows Presentation FoundationBinaryFormatter.

Načítání a ukládání prostředků během návrhu

Pro typy, které nejsou vnitřně zpracovány během serializace do prostředků, jako je například v případě Návrháře se scénáři ResX, je předepsaného způsobu migrace pryč BinaryFormatter zajistit TypeConverter , že je registrován pro typ nebo vlastnost, která se účastní serializace. Tímto způsobem se během serializace a deserializace používá místo, TypeConverter kde BinaryFormatter byl použit. Další informace o implementaci převaděče typů naleznete v tématu TypeConverter Třída.

Uživatelé .NET 9, kteří nemůžou migrovat, BinaryFormatter můžou nainstalovat nepodporovaný balíček kompatibility. Další informace najdete v BinaryFormatter průvodci migrací: Balíček kompatibility.

Upozornění

BinaryFormatter je nebezpečná a nedoporučuje se, protože vystavuje aplikace riziku útoků, jako je odepření služby (DoS), zpřístupnění informací nebo vzdálené spuštění kódu. Další informace o rizicích BinaryFormatter , které představují, naleznete v tématu Rizika deserializace při použití BinaryFormatter a souvisejících typů.

Problémy

Pokud u aplikace Windows Forms dochází k neočekávanému chování souvisejícím se BinaryFormatter serializací nebo deserializací, vytvořte problém na github.com/dotnet/winforms a uveďte, že problém souvisí s odebráním BinaryFormatter.