Rozhraní API serializace BinaryFormatter vytvářejí chyby při kompilaci.

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:

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

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

Viz také