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

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.

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

Confira também