Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Jako součást dlouhodobého plánu vyřazení BinaryFormatter pokračujeme ve vyřazování funkcí z našich knihoven a odvykání vývojářů od používání tohoto typu. Počínaje rozhraním .NET 7 můžou volání následujících rozhraní API vést k chybám kompilace ve všech typech projektů jazyka C# a Visual Basic:
- událost System.Exception.SerializeObjectState
- metoda BinaryFormatter.Serialize
- metoda BinaryFormatter.Deserialize
- metoda Formatter.Serialize(Stream, Object)
- metoda Formatter.Deserialize(Stream)
- metoda IFormatter.Serialize(Stream, Object)
- metoda IFormatter.Deserialize(Stream)
Předchozí chování
Od vydání .NET 5, použití dotčených Serialize a Deserialize metod vytvořilo kompilátorové upozornění s ID SYSLIB0011. Další informace naleznete v tématu serializační metody BinaryFormatteru jsou zastaralé a zakázané v aplikacích ASP.NET (.NET 5).
Použití události Exception.SerializeObjectState nevytvořilo chybu.
Nové chování
Počínaje verzí .NET 7 vytvoří použití libovolného ovlivněného API v kódu chybu kompilátoru se stejným ID. SYSLIB0011 Projekt bude ovlivněn, pokud splňuje všechna následující kritéria:
- Jedná se o projekt jazyka C# nebo Visual Basic.
- Cílí
net7.0nebo na vyšší úroveň. - Přímo volá jedno z ovlivněných rozhraní API.
- Ještě to nepotlačuje kód upozornění
SYSLIB0011.
Verze byla představena
.NET 7
Typ zásadní změny
Tato změna může ovlivnit kompatibilitu zdroje.
Důvod změny
Jako součást dlouhodobého plánu vyřazení BinaryFormatter pokračujeme ve vyřazování funkcí z našich knihoven a odvykání vývojářů od používání tohoto typu.
Doporučená akce
Kvůli chybám v zabezpečení a spolehlivosti je nejlepší postup migrovat pryč od BinaryFormatter.
BinaryFormatter v budoucí verzi může být odebrána z .NET. Tým knihoven .NET již zaujal postoj, že nedávné typy, jako jsou System.Half a System.DateOnly, nebudou kompatibilní s BinaryFormatter.
Pokud musíte potlačit chyby, můžete tak učinit podle pokynů v původním článku o zastaralosti. Chybu můžete také zakázat nastavením vlastnosti projektu, která chybu převede zpět na upozornění (aby odpovídala chování rozhraní .NET 5/6).
Výstraha
Nastavení této vlastnosti může změnit chování hostitele. Viz <EnableUnsafeBinaryFormatterSerialization> vlastnost.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Poznámka:
Pokud se projekt zkompiluje s povolenými upozorněními jako chybami, kompilace se stále nezdaří. (Odpovídá chování dodanému v sadách SDK .NET 5 a .NET 6.) V takovém případě budete muset potlačit upozornění SYSLIB0011 ve zdrojovém kódu nebo v elementu <NoWarn> souboru projektu.
<EnableUnsafeBinaryFormatterSerialization> vlastnost
Vlastnost <EnableUnsafeBinaryFormatterSerialization byla zavedena v .NET 5. U rozhraní .NET 7 se chování tohoto přepínače změnilo tak, aby kontrolovalo chování při kompilaci i modulu runtime hostitele. Význam tohoto přepínače se liší podle typu projektu, jak je popsáno v následující tabulce.
| Typ projektu | Vlastnost nastavená na true |
Vlastnost nastavená na false |
Vlastnost vynechána. |
|---|---|---|---|
| Knihovna/sdílená komponenta1 | Ovlivněná rozhraní API jsou zastaralá, což slouží jako upozornění. Kompilace bude úspěšná, pokud nemáte zapnutá upozornění jako chyby pro vaši aplikaci nebo jste potlačili kód upozornění SYSLIB0011. |
Ovlivněná rozhraní API jsou chybná kvůli své zastaralosti, a volání z vašeho kódu k těmto rozhraním API selžou během sestavení, pokud nebudou potlačeny chyby. | (Stejné jako pro false.) |
| Aplikace Blazor a MAUI2 | Volání na BinaryFormatter selže za běhu programu. |
Volání na BinaryFormatter za běhu programu selže. |
Volání k BinaryFormatter za běhu selžou. |
| Aplikace v ASP.NET | Ovlivněná rozhraní API jsou zastaralá, což slouží jako upozornění. Kompilace bude úspěšná, pokud nemáte zapnutá upozornění jako chyby pro vaši aplikaci nebo jste potlačili kód upozornění SYSLIB0011. Modul runtime umožní volání BinaryFormatter, bez ohledu na to, jestli volání pochází z vašeho kódu nebo z závislosti, kterou používáte. |
Ovlivněná rozhraní API jsou chybná kvůli své zastaralosti, a volání z vašeho kódu k těmto rozhraním API selžou během sestavení, pokud nebudou potlačeny chyby. Modul runtime zakáže volání BinaryFormatterbez ohledu na to, jestli volání pochází z vašeho kódu nebo z závislosti, kterou používáte. |
(Stejné jako pro false.) |
| Desktopové aplikace a všechny ostatní typy aplikací | Ovlivněná rozhraní API jsou zastaralá, což slouží jako upozornění. Kompilace bude úspěšná, pokud nemáte zapnutá upozornění jako chyby pro vaši aplikaci nebo jste potlačili kód upozornění SYSLIB0011. Modul runtime umožní volání BinaryFormatter, bez ohledu na to, jestli volání pochází z vašeho kódu nebo z závislosti, kterou používáte. |
Ovlivněná rozhraní API jsou chybná kvůli své zastaralosti, a volání z vašeho kódu k těmto rozhraním API selžou během sestavení, pokud nebudou potlačeny chyby. Modul runtime zakáže volání BinaryFormatterbez ohledu na to, jestli volání pochází z vašeho kódu nebo z závislosti, kterou používáte. |
Ovlivněná rozhraní API jsou chybná kvůli své zastaralosti, a volání z vašeho kódu k těmto rozhraním API selžou během sestavení, pokud nebudou potlačeny chyby. Modul runtime umožní volání BinaryFormatter, bez ohledu na to, jestli volání pochází z vašeho kódu nebo z závislosti, kterou používáte. |
1Zásady modulu runtime řídí hostitel aplikace. I když je v souboru projektu vaší knihovny nastaveno <EnableUnsafeBinaryFormatterSerialization> na true, volání do BinaryFormatter může stále selhat za běhu. Knihovny nemůžou převýšit zásady běhového prostředí hostitele aplikace.
2Moduly runtime Blazor a MAUI zakazují volání BinaryFormatter. Bez ohledu na hodnotu, pro <EnableUnsafeBinaryFormatterSerialization>kterou jste nastavili, se volání za běhu nezdaří. Tato rozhraní API nevolejte z aplikací Blazor nebo MAUI ani z knihoven, které mají být využívané aplikacemi Blazor nebo MAUI.
Ovlivněná rozhraní API
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)