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.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
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ítprivate
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.
Alternativní řešení kompatibility (nedoporučuje se)
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.