Windows Forms Guia de migração para BinaryFormatter
BinaryFormatter remoção
A partir do .NET 9, BinaryFormatter não há mais suporte devido aos seus riscos de segurança conhecidos e suas APIs sempre lançam um PlatformNotSupportedException para todos os tipos de projeto, incluindo Windows Forms aplicativos. Para obter mais informações sobre os riscos BinaryFormatter apresentados e o motivo de sua remoção, consulte o guia de BinaryFormatter migração.
Com BinaryFormattera remoção do , espera-se que muitos Windows Forms aplicativos 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, Windows Forms usado BinaryFormatter para 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 e do WPF, Windows Forms use um subconjunto da BinaryFormatter implementação internamente para esses cenários. Embora BinaryFormatteros riscos do não possam ser abordados na serialização/desserialização de uso geral, medidas foram tomadas para mitigar 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 lançará exceções, a menos que as etapas de migração sejam executadas no aplicativo.
Windows Forms e aplicativos WPF ambos 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 a necessidade de etapas de migração.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms também suporta os seguintes tipos adicionais:
Cenários OLE
Para obter informações sobre os efeitos BinaryFormatter que a remoção tem em cenários OLE, como área de transferência e arrastar e soltar, bem como diretrizes de migração, consulte Windows Forms e Orientação OLE do Windows Presentation FoundationBinaryFormatter.
Recursos (ResX)
O Windows Forms Designer
O Windows Forms Out-Of-Process Designer 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 Windows Forms Designer. Uma maneira usada que BinaryFormatter você pode não estar ciente é quando uma public
propriedade em um IComponent é introduzida e essa propriedade é preenchida ou editada em tempo de 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 DefaultValueAttributearquivo .
- Essa propriedade não tem um respetivo
bool ShouldSerialize[PropertyName]
método que retornafalse
no momento do processo de serialização CodeDOM. (Nota: o método pode terprivate
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 usa BinaryFormatter para serializar o conteúdo no arquivo de recurso. Windows Forms adicionou analisadores juntamente com correções de código para ajudar a chamar a atenção para esse tipo de comportamento em que BinaryFormatter a serialização pode estar ocorrendo sem o conhecimento do desenvolvedor.
Carregando recurso durante o tempo de execução
Os tipos que foram serializados anteriormente em arquivos de recursos continuarão BinaryFormatter a desserializar conforme o esperado, sem a necessidade BinaryFormatter de como o conteúdo dos arquivos ResX são considerados dados confiáveis. No caso raro em que a desserialização não pode ocorrer sem 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 configuração System.Resources.Extensions.UseBinaryFormatter
da mudança de contexto do aplicativo para true
é necessária para usar BinaryFormatter para recursos.
Gerando arquivos de recursos via msbuild
Ao gerar arquivos de recursos via msbuild, você pode encontrar um MSB3825
erro que especifica que seus recursos formatados binários podem ser desserializados usando BinaryFormatter durante o tempo de execução. Como dito 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 pode ocorrer sem BinaryFormattero , ele pode ser adicionado 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 configuração System.Resources.Extensions.UseBinaryFormatter
da mudança de contexto do aplicativo para true
é necessária para usar BinaryFormatter para recursos.
Migrar de BinaryFormatter
Se os tipos que não são intrinsecamente manipulados 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 OLE
Consulte Windows Forms as orientações OLE do Windows Presentation Foundation BinaryFormatter para obter mais informações sobre como migrar para fora em cenários como área de BinaryFormatter transferência e arrastar e soltar.
Carregando e economizando recursos durante o tempo de projeto
Para tipos que não são intrinsecamente manipulados durante a serialização em recursos, como no caso dos cenários Designer com ResX, a maneira prescrita de migrar é BinaryFormatter garantir que a TypeConverter
seja registrada para o tipo ou propriedade que está participando da serialização. Desta forma, durante a serialização e desserialização, o TypeConverter
é usado em vez de onde BinaryFormatter foi usado uma vez. Para obter mais informações sobre como implementar um conversor de tipo, consulte TypeConverter
Classe.
Solução alternativa de compatibilidade (não recomendada)
Os usuários do .NET 9 que não podem migrar podem instalar um pacote de BinaryFormatter compatibilidade sem suporte. Para obter mais informações, consulte BinaryFormatter Guia de migração: Pacote de compatibilidade.
Atenção
BinaryFormatter é perigoso e não é recomendado, pois coloca o consumo de aplicativos em risco de 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 BinaryFormatter representados, consulte Riscos de desserialização em uso e BinaryFormatter tipos relacionados.
Problemas
Se você tiver um comportamento inesperado com seu Windows Forms aplicativo em relação à BinaryFormatter serialização ou desserialização, registre um problema no github.com/dotnet/winforms e indique que o problema está relacionado à remoção do BinaryFormatter.