Compartilhar via


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 do Visual Basic:

Comportamento anterior

Desde o .NET 5, o uso dos métodos afetados Serialize e Deserialize produziu um aviso do compilador com a ID SYSLIB0011. Para obter mais informações, consulte Os métodos de serialização BinaryFormatter são obsoletos e proibidos em aplicativos de ASP.NET (.NET 5).

O uso do Exception.SerializeObjectState evento não produziu um erro.

Novo comportamento

A partir do .NET 7, o uso de qualquer uma das APIs afetadas no código produz um erro do compilador com a mesma ID SYSLIB0011. Seu projeto será afetado se atender a todos os seguintes critérios:

  • É um projeto C# ou Visual Basic.
  • Tem como destino o net7.0 ou superior.
  • Ele chama diretamente uma das APIs afetadas.
  • Ele ainda não está suprimindo o código de aviso SYSLIB0011.

Versão introduzida

.NET 7

Tipo de mudança disruptiva

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.

O melhor curso de ação é migrar para fora de BinaryFormatter devido às suas falhas de segurança e confiabilidade. BinaryFormatter pode ser removido do .NET em uma versão futura. A equipe de bibliotecas do .NET já tomou uma posição de que tipos recentes como System.Half e System.DateOnly não serão compatíveis com BinaryFormatter.

Se você precisar suprimir os erros, poderá fazer isso seguindo as diretrizes no artigo original de obsolescência. Você também pode desabilitar o erro em todo o projeto definindo uma propriedade de projeto que converte o erro de volta em um aviso (para corresponder ao comportamento do .NET 5/6).

Aviso

Definir essa propriedade pode alterar o comportamento do host. Consulte <EnableUnsafeBinaryFormatterSerialization> a propriedade.

<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 distribuído nos SDKs do .NET 5 e do .NET 6.) Nesse caso, você ainda precisará suprimir o aviso na origem SYSLIB0011 ou no elemento <NoWarn> do arquivo do projeto.

Propriedade <EnableUnsafeBinaryFormatterSerialization>

A <EnableUnsafeBinaryFormatterSerialization propriedade foi introduzida no .NET 5. Com o .NET 7, o comportamento dessa alternativa foi alterado para controlar tanto a compilação quanto o comportamento do tempo de execução do host. O significado dessa opção é diferente com base no tipo de projeto, conforme descrito na tabela a seguir.

Tipo de projeto Propriedade definida como true Propriedade definida como false Propriedade omitida
Biblioteca/componente 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 momento da compilação, a menos que o erro seja suprimido. (O mesmo que para false.)
Aplicativos Blazor e MAUI2 As chamadas para BinaryFormatter falharão em tempo de execução. As chamadas para BinaryFormatter falharão em tempo de execução. As chamadas para BinaryFormatter falharão durante o 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 momento da compilação, a menos que o erro seja suprimido. O tempo de execução proibirá chamadas para BinaryFormatter, independentemente de a chamada ter origem no seu código ou em uma dependência que você consome. (O mesmo que para false.)
Aplicativos de desktop e todos os outros tipos de aplicativos 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 momento da compilação, a menos que o erro seja suprimido. O tempo de execução proibirá chamadas para BinaryFormatter, independentemente de a chamada ter origem no seu código ou em 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 momento da 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 BinaryFormatter ainda poderão falhar no runtime, mesmo que <EnableUnsafeBinaryFormatterSerialization> esteja definida no true 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 de qualquer valor que você definir para <EnableUnsafeBinaryFormatterSerialization>, as chamadas falharão durante a execução. Não chame essas APIs de aplicativos Blazor ou MAUI ou de bibliotecas destinadas a serem consumidas por aplicativos Blazor ou MAUI.

APIs afetadas

Consulte também