APIs de serialização BinaryFormatter produzem erros de compilador
Como parte do plano de substituição de longo prazo do BinaryFormatter, continuamos a eliminar a funcionalidade BinaryFormatter
de nossas bibliotecas e a acostumar os desenvolvedores a esquecer o tipo. A partir do .NET 7, as chamadas para as seguintes APIs produzem erros de tempo de compilação em todos os tipos de projeto do C# e Visual Basic:
- Evento System.Exception.SerializeObjectState
- Método BinaryFormatter.Serialize
- Método BinaryFormatter.Deserialize
- Método Formatter.Serialize(Stream, Object)
- Método Formatter.Deserialize(Stream)
- Método IFormatter.Serialize(Stream, Object)
- Método IFormatter.Deserialize(Stream)
Comportamento anterior
Desde o .NET 5, o uso dos métodos afetados Serialize
e Deserialize
produzem um aviso do compilador com a ID SYSLIB0011
. Para obter mais informações, confira Os métodos de serialização BinaryFormatter são obsoletos e proibidos em aplicativos ASP.NET (.NET 5).
O uso do evento Exception.SerializeObjectState não gerou erros.
Novo comportamento
A partir do .NET 7, o uso de qualquer uma das APIs afetadas no código gera um erro de compilador com a mesma ID, SYSLIB0011
. Seu projeto será afetado se atender a todos estes critérios:
- É um projeto em C# ou Visual Basic.
- Tem como destino o
net7.0
ou superior. - Chama uma das APIs afetadas diretamente.
- Ainda não está suprimindo o código de aviso
SYSLIB0011
.
Versão introduzida
.NET 7
Tipo de alteração interruptiva
Essa alteração pode afetar a compatibilidade da origem.
Motivo da alteração
Como parte do plano de substituição de longo prazo do BinaryFormatter, continuamos a eliminar a funcionalidade BinaryFormatter
de nossas bibliotecas e a acostumar os desenvolvedores a esquecer o tipo.
Ação recomendada
O melhor curso de ação é migrar para longe do BinaryFormatter
devido a suas falhas de segurança e confiabilidade. O BinaryFormatter
pode ser removido do .NET em uma versão futura. A equipe de bibliotecas do .NET já assumiu uma posição de que tipos recentes como System.Half e System.DateOnly não serão compatíveis com BinaryFormatter
.
Caso precise suprimir os erros, você pode fazer isso seguindo as diretrizes do artigo de obsolescência original. Você também pode desabilitar o erro em todo o projeto ao definir uma propriedade de projeto que reconverta o erro em um aviso (para corresponder ao comportamento do .NET 5/6).
Aviso
A definição dessa propriedade pode alterar o comportamento do host. Confira <Propriedade EnableUnsafeBinaryFormatterSerialization>.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Observação
Se o projeto for compilado com a opção “avisos como erros” habilitada, a compilação continuará falhando. (Isso corresponde ao comportamento que ocorre nos SDKs do .NET 5 e do .NET 6.) Se esse for o caso, você ainda precisará suprimir o aviso SYSLIB0011
na origem ou no elemento <NoWarn>
do arquivo de projeto.
Propriedade <EnableUnsafeBinaryFormatterSerialization>
A propriedade <EnableUnsafeBinaryFormatterSerialization
foi introduzida no .NET 5. Com o .NET 7, o comportamento dessa opção foi alterado para controlar o comportamento em tempo de execução da compilação e do host. O significado dessa opção é diferente dependendo do tipo de projeto, conforme descrito na tabela a seguir.
Tipo de projeto | Propriedade definida como true |
Propriedade definida como false |
Propriedade omitida |
---|---|---|---|
Componente de biblioteca/compartilhado1 | As APIs afetadas são obsoletas como aviso. A compilação terá êxito, a menos que a opção “avisos como erros” esteja habilitada para seu aplicativo ou que você tenha suprimido o código de aviso SYSLIB0011 . |
As APIs afetadas são obsoletas como erro, e as chamadas do código para essas APIs falharão no tempo de compilação, a menos que o erro seja suprimido. | (O mesmo que false .) |
Aplicativos Blazor e MAUI2 | As chamadas para BinaryFormatter falharão no tempo de execução. |
As chamadas para BinaryFormatter falharão no tempo de execução. |
As chamadas para BinaryFormatter falharão no tempo de execução. |
Aplicativo do ASP.NET | As APIs afetadas são obsoletas como aviso. A compilação terá êxito, a menos que a opção “avisos como erros” esteja habilitada para seu aplicativo ou que você tenha suprimido o código de aviso SYSLIB0011 . O runtime permitirá chamadas para BinaryFormatter , independentemente de a chamada se originar do seu código ou de uma dependência que você consome. |
As APIs afetadas são obsoletas como erro, e as chamadas do código para essas APIs falharão no tempo de compilação, a menos que o erro seja suprimido. O runtime proibirá chamadas para BinaryFormatter , independentemente de a chamada se originar do seu código ou de uma dependência que você consome. |
(O mesmo que false .) |
Aplicativos da área de trabalho e todos os outros tipos de aplicativo | As APIs afetadas são obsoletas como aviso. A compilação terá êxito, a menos que a opção “avisos como erros” esteja habilitada para seu aplicativo ou que você tenha suprimido o código de aviso SYSLIB0011 . O runtime permitirá chamadas para BinaryFormatter , independentemente de a chamada se originar do seu código ou de uma dependência que você consome. |
As APIs afetadas são obsoletas como erro, e as chamadas do código para essas APIs falharão no tempo de compilação, a menos que o erro seja suprimido. O runtime proibirá chamadas para BinaryFormatter , independentemente de a chamada se originar do seu código ou de uma dependência que você consome. |
As APIs afetadas são obsoletas como erro, e as chamadas do código para essas APIs falharão no tempo de compilação, a menos que o erro seja suprimido. O runtime permitirá chamadas para BinaryFormatter , independentemente de a chamada se originar do seu código ou de uma dependência que você consome. |
1A política de runtime é controlada pelo host do aplicativo. As chamadas para BinaryFormatter
ainda poderão falhar em tempo de execução, mesmo que <EnableUnsafeBinaryFormatterSerialization>
esteja definida como true
no arquivo de projeto da biblioteca. As bibliotecas não podem substituir a política de runtime do host do aplicativo.
2Os runtimes do Blazor e MAUI proíbem chamadas para BinaryFormatter
. Independentemente do valor definido para <EnableUnsafeBinaryFormatterSerialization>
, as chamadas falharão no tempo de execução. Não chame essas APIs de aplicativos Blazor ou MAUI ou de bibliotecas destinadas a serem consumidas por esses aplicativos.
APIs afetadas
- 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)