Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Som en del av den långsiktiga utfasningsplanen för BinaryFormatter fortsätter vi att gallra bort BinaryFormatter funktioner från våra bibliotek och avväpna utvecklare från typen. Från och med .NET 7 skapar anrop till följande API:er kompileringsfel för alla C#- och Visual Basic-projekttyper:
- System.Exception.SerializeObjectState evenemang
- BinaryFormatter.Serialize metod
- BinaryFormatter.Deserialize metod
- Formatter.Serialize(Stream, Object) metod
- Formatter.Deserialize(Stream) metod
- IFormatter.Serialize(Stream, Object) metod
- IFormatter.Deserialize(Stream) metod
Tidigare beteende
Sedan .NET 5 har användningen av de berörda metoderna Serialize och Deserialize producerat en kompilatorvarning med ID .SYSLIB0011 För mer information, se att BinaryFormatter-serialiseringsmetoder är föråldrade och förbjudna i ASP.NET-appar (.NET 5).
Det uppstod inget fel vid användning av Exception.SerializeObjectState händelsen.
Nytt beteende
Från och med .NET 7 skapar någon av de berörda API:erna i kod ett kompilatorfel med samma ID, . SYSLIB0011 Projektet påverkas om det uppfyller alla följande kriterier:
- Det är ett C#- eller Visual Basic-projekt.
- Den riktar sig mot
net7.0eller högre. - Den anropar direkt ett av de berörda API:erna.
- Varningskoden undertrycks inte redan.
Version lanserad
.NET 7
Typ av brytande ändring
Den här ändringen kan påverka källkompatibilitet.
Orsak till ändring
Som en del av den långsiktiga utfasningsplanen för BinaryFormatter fortsätter vi att gallra bort BinaryFormatter funktioner från våra bibliotek och avväpna utvecklare från typen.
Rekommenderad åtgärd
Det bästa sättet är att migrera bort från BinaryFormatter på grund av dess säkerhets- och tillförlitlighetsfel.
BinaryFormatter kan tas bort från .NET i en framtida version. .NET-biblioteksteamet har redan tagit ställning till att de senaste typerna, till exempel System.Half och System.DateOnly inte är kompatibla med BinaryFormatter.
Om du måste förhindra felen kan du göra det genom att följa riktlinjerna i den ursprungliga obsoletionsartikeln. Du kan också inaktivera felet projektomfattande genom att ange en projektegenskap som konverterar felet tillbaka till en varning (för att matcha beteendet .NET 5/6).
Varning
Om du anger den här egenskapen kan värdbeteendet ändras. Se <EnableUnsafeBinaryFormatterSerialization>-egenskapen.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Anmärkning
Om projektet kompileras med "varningar som fel" aktiverat misslyckas kompilering fortfarande. (Detta matchar det beteende som levererades i .NET 5- och .NET 6 SDK:er.) Om så är fallet måste du fortfarande ignorera varningen SYSLIB0011 i källan eller i projektfilens <NoWarn> element.
<EnableUnsafeBinaryFormatterSerialization-egenskap>
Egenskapen <EnableUnsafeBinaryFormatterSerialization introducerades i .NET 5. Med .NET 7 har beteendet för den här växeln ändrats för att styra både kompilerings- och värdkörningsbeteendet. Innebörden av den här växeln skiljer sig beroende på projekttyp, enligt beskrivningen i följande tabell.
| Typ av projekt | Egenskapen är inställd på true |
Egenskapen är inställd på false |
Egenskapen utelämnas |
|---|---|---|---|
| Bibliotek/delad komponent1 | De berörda API:erna är föråldrade som varning. Kompilering lyckas om du inte har "varningar som fel" aktiverat för ditt program eller om du har utelämnat varningskoden SYSLIB0011 . |
De berörda API:erna är föråldrade som fel, och anrop från koden till dessa API:er misslyckas vid kompileringstillfället om inte felet undertrycks. | (Samma som för false.) |
| Blazor- och MAUI-appar2 | Anrop till BinaryFormatter misslyckas vid körning. |
Anrop till BinaryFormatter misslyckas vid körning. |
Anrop till BinaryFormatter misslyckas vid körning. |
| ASP.NET-app | De berörda API:erna är föråldrade som varning. Kompilering lyckas om du inte har "varningar som fel" aktiverat för ditt program eller om du har utelämnat varningskoden SYSLIB0011 . Programmet tillåter anrop till BinaryFormatter, oavsett om anropet kommer från din kod eller från ett beroende du använder. |
De berörda API:erna är föråldrade som fel, och anrop från koden till dessa API:er misslyckas vid kompileringstillfället om inte felet undertrycks. Körmiljön förbjuder anrop till BinaryFormatter, oavsett om anropet kommer från din kod eller från ett komponentberoende som du använder. |
(Samma som för false.) |
| Skrivbordsappar och alla andra apptyper | De berörda API:erna är föråldrade som varning. Kompilering lyckas om du inte har "varningar som fel" aktiverat för ditt program eller om du har utelämnat varningskoden SYSLIB0011 . Programmet tillåter anrop till BinaryFormatter, oavsett om anropet kommer från din kod eller från ett beroende du använder. |
De berörda API:erna är föråldrade som fel, och anrop från koden till dessa API:er misslyckas vid kompileringstillfället om inte felet undertrycks. Körmiljön förbjuder anrop till BinaryFormatter, oavsett om anropet kommer från din kod eller från ett komponentberoende som du använder. |
De berörda API:erna är föråldrade som fel, och anrop från koden till dessa API:er misslyckas vid kompileringstillfället om inte felet undertrycks. Programmet tillåter anrop till BinaryFormatter, oavsett om anropet kommer från din kod eller från ett beroende du använder. |
1Körningspolicyn styrs av appvärden. Anrop till BinaryFormatter kan fortfarande misslyckas vid körning även om <EnableUnsafeBinaryFormatterSerialization> är inställt på true i bibliotekets projektfil. Bibliotek kan inte åsidosätta appvärdens körningsprincip.
2Blazor- och MAUI-körmiljöerna förbjuder anrop till BinaryFormatter. Oavsett vilket värde du anger för <EnableUnsafeBinaryFormatterSerialization>, misslyckas anropen vid körningstid. Anropa inte dessa API:er från Blazor- eller MAUI-program eller från bibliotek som är avsedda att användas av Blazor- eller MAUI-appar.
Berörda API:er
- 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)