Compartilhar via


Guia de migração Windows Forms para BinaryFormatter

Remoção de BinaryFormatter.

A partir do .NET 9, BinaryFormatter não há mais suporte devido aos riscos de segurança conhecidos e suas APIs sempre lançam um PlatformNotSupportedException para todos os tipos de projeto, incluindo aplicativos Windows Forms. Para obter mais informações sobre os riscos do BinaryFormatter e o motivo de sua remoção, consulte o Guia de migração BinaryFormatter.

Com a remoção oe BinaryFormatter, espera-se que muitos aplicativos do Windows Forms sejam afetados e você precisará tomar medidas para concluir sua migração para o .NET 9 ou uma versão posterior.

Como BinaryFormatter afeta Windows Forms

Antes do .NET 9, o Windows Forms costumava BinaryFormatter serializar e desserializar dados para cenários como área de transferência, arrastar e soltar e armazenar ou carregar recursos em tempo de design. A partir do .NET 9, o Windows Forms e o WPF usam um subconjunto da implementação de BinaryFormatter internamente para esses cenários. Embora os riscos do BinaryFormatter não possam ser resolvidos na serialização/desserialização de uso geral, tomamos medidas para atenuar os riscos nesses casos de uso muito específicos com um conjunto conhecido de tipos. Um fall-back para BinaryFormatter ainda está em vigor para tipos desconhecidos ou sem suporte, o que gerará exceções, a menos que as etapas de migração sejam tomadas no aplicativo.

O Windows Forms e os aplicativos WPF lidam com os seguintes tipos, juntamente com matrizes e listas desses tipos. Os recursos de área de transferência, arrastar e soltar e tempo de design continuarão a funcionar com esses tipos sem as etapas de migração necessárias.

Windows Forms também dá suporte aos seguintes tipos adicionais:

Cenários da OLE

Para obter informações sobre os efeitos que a remoção do BinaryFormatter tem em cenários OLE, como área de transferência e arrastar e soltar, bem como diretrizes de migração, consulte Windows Forms e as diretrizes OLE da BinaryFormatterWindows Presentation Foundation.

Recursos (ResX)

O Designer do Windows Forms

O Designer Fora de Processo do Windows Forms também usa BinaryFormatter internamente para serialização e desserialização do ResX.

Tipos e propriedades podem participar da serialização sem que você perceba devido ao comportamento padrão do Designer do Windows Forms. Uma formar de usar o BinaryFormatter que você pode não estar ciente é quando uma propriedade public em um IComponent é introduzida e essa propriedade é preenchida ou editada no momento do design. Essa propriedade é serializada em arquivos de recursos nas seguintes condições:

  • Uma propriedade pública contém dados no momento em que um Form no Designer é salvo.
  • Essa propriedade não é somente leitura.
  • Essa propriedade não é atribuída com [DesignerSerializationVisibility(false)].
  • Essa propriedade não tem um DefaultValueAttribute.
  • Essa propriedade não tem um método bool ShouldSerialize[PropertyName] respectivo que retorna false no momento do processo de serialização CodeDOM. (Observação: o método pode ter private escopo.)
  • Essa propriedade é um tipo que não tem um DesignerSerializer

Se essas instruções forem verdadeiras, o Designer determinará se o tipo dessa propriedade tem um conversor de tipo. Se isso acontecer, o Designer usará o conversor de tipo para serializar o conteúdo da propriedade. Caso contrário, ele usará BinaryFormatter para serializar o conteúdo no arquivo de recurso. O Windows Forms adicionou analisadores juntamente com correções de código para ajudar a conscientizar esse tipo de comportamento em que a serialização BinaryFormatter pode estar ocorrendo sem o conhecimento do desenvolvedor.

Carregando o recurso durante o runtime

Os tipos que foram serializados anteriormente em arquivos de recurso por meio do BinaryFormatter continuarão a desserializar conforme o esperado sem a necessidade do BinaryFormatter, pois o conteúdo dos arquivos ResX é considerado dados confiáveis. No raro caso em que a desserialização não possa ocorrer sem o BinaryFormatter, ela pode ser adicionada novamente com um pacote de compatibilidade sem suporte. Consulte o BinaryFormatter Guia de migração: Pacote de Compatibilidade para obter detalhes. Observe que uma etapa extra de configurar a alternância de contexto do aplicativo do System.Resources.Extensions.UseBinaryFormatter para true é necessária para usar os recursos do BinaryFormatter.

Gerando arquivos de recurso via msbuild

Ao gerar arquivos de recurso por meio do msbuild, você pode encontrar um erro MSB3825 que especifica que seus recursos formatados binários podem ser desserializados usando BinaryFormatter durante o tempo de execução. Conforme mencionado acima, esses recursos não serão desserializados usando BinaryFormatter e esse aviso pode ser desativado definindo a propriedade GenerateResourceWarnOnBinaryFormatterUse como false. Em casos raros em que a desserialização não possa ocorrer sem o BinaryFormatter, ela pode ser adicionada novamente com um pacote de compatibilidade sem suporte. Consulte o BinaryFormatter Guia de migração: Pacote de Compatibilidade para obter detalhes. Observe que uma etapa adicional de configurar a alternância de contexto do aplicativo do System.Resources.Extensions.UseBinaryFormatter para true é necessária para usar os recursos do BinaryFormatter.

Migrar do BinaryFormatter

Se os tipos que não são tratados intrinsecamente durante a serialização e desserialização forem usados nos cenários afetados, você precisará tomar medidas para concluir a migração para o .NET 9 ou uma versão posterior.

Cenários da OLE

Consulte Windows Forms e as diretrizes OLE da BinaryFormatter Windows Presentation Foundation para obter mais informações sobre como migrar em cenários de BinaryFormatter, como área de transferência e arrastar e soltar.

Como carregar e salvar recursos durante o tempo de design

Para tipos que não são tratados intrinsecamente durante a serialização em recursos, como no caso do Designer com cenários ResX, a maneira prescrita de migrar do BinaryFormatter é garantir que um TypeConverter esteja registrado para o tipo ou propriedade que está participando da serialização. Dessa forma, durante a serialização e desserialização, o TypeConverter é usado onde o BinaryFormatter era usado. Para obter mais informações sobre como implementar um conversor de tipo, consulte TypeConverter Classe.

Os usuários do .NET 9 que não conseguem migrar do BinaryFormatter podem instalar um pacote de compatibilidade sem suporte. Para obter mais informações, consulte o BinaryFormatter Guia de migração: Pacote de Compatibilidade.

Cuidado

O BinaryFormatter é perigoso e não recomendado, pois coloca em risco o consumo de aplicativos para ataques como negação de serviço (DoS), divulgação de informações ou execução remota de código. Para obter mais informações sobre os riscos do BinaryFormatter, consulte Riscos de desserialização no uso de tipos BinaryFormatter e relacionados.

Problemas

Se você tiver um comportamento inesperado com seu aplicativo Windows Forms em relação à serialização ou desserialização de BinaryFormatter, relate um problema em github.com/dotnet/winforms e indique que o problema está relacionado à remoção do BinaryFormatter.