Partilhar via


SYSLIB0050: A serialização baseada em Formatter está obsoleta

As APIs a seguir estão obsoletas, começando no .NET 8. Chamá-los em código gera aviso SYSLIB0050 em tempo de compilação.

Solução

  • Se você estava usando FormatterServices.GetUninitializedObject(Type), use RuntimeHelpers.GetUninitializedObject(Type) em vez disso.

    Se você compilar para .NET Framework e .NET moderno, você pode usar uma #if instrução para chamar seletivamente a API apropriada, conforme mostrado no trecho a seguir.

    Type typeToInstantiate;
    #if NET5_0_OR_GREATER
    object obj = System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeToInstantiate);
    #else
    object obj = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeToInstantiate);
    #endif
    
  • Se você estiver escrevendo uma biblioteca de serialização, é altamente recomendável evitar bibliotecas de serialização que ofereçam suporte à infraestrutura de serialização herdada ([Serializable] e ISerializable). As bibliotecas de serialização modernas devem ter uma política baseada nas APIs públicas de um tipo, em vez de seus detalhes de implementação privados. Se você basear um serializador nesses detalhes de implementação e vinculá-lo fortemente a ISerializable outros mecanismos que incentivem a incorporação de nomes de tipo na carga serializada, isso pode levar aos problemas descritos em Riscos de desserialização no uso de BinaryFormatter e tipos relacionados.

    Se sua biblioteca de serialização deve permanecer compatível com a infraestrutura de serialização herdada, você pode facilmente suprimir as obsolações da API de serialização herdada.

Suprimir um aviso

Se você precisar usar as APIs obsoletas, poderá suprimir o aviso no código ou no arquivo de projeto.

Para suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desativar e reativar o aviso.

// Disable the warning.
#pragma warning disable SYSLIB0050

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0050

Para suprimir todos os SYSLIB0050 avisos em seu projeto, adicione uma <NoWarn> propriedade ao seu arquivo de projeto.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
  </PropertyGroup>
</Project>

Para obter mais informações, consulte Suprimir avisos.

Consulte também