Compartilhar via


SYSLIB0050: a serialização baseada em formatador está obsoleta

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

Solução alternativa

  • Se estiver usando o FormatterServices.GetUninitializedObject(Type), use RuntimeHelpers.GetUninitializedObject(Type).

    Se você compilar entre o .NET Framework e o .NET moderno, poderá usar uma instrução #if para chamar seletivamente a API apropriada, conforme mostrado no snippet 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 não usar bibliotecas de serialização que dão suporte à infraestrutura de serialização herdada ([Serializable] e ISerializable). Bibliotecas de serialização modernas devem ter uma política baseada nas APIs públicas de um tipo, em vez dos detalhes de implementação privada. Se você basear um serializador nesses detalhes de implementação e vinculá-lo fortemente a ISerializable e a outros mecanismos que incentivam a inserção de nomes de tipo no conteúdo serializado, isso poderá levar aos problemas descritos em Riscos de desserialização no uso de BinaryFormatter e tipos relacionados.

    Se a biblioteca de serialização precisar permanecer compatível com a infraestrutura de serialização herdada, você poderá suprimir facilmente as obsolescências da API de serialização herdada.

Suprimir um aviso

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

Para suprimir apenas uma violação única, adicione as diretivas de pré-processador ao arquivo de origem para desabilitar e, em seguida, reabilite 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 avisos SYSLIB0050 no projeto, adicione uma propriedade <NoWarn> ao arquivo de projeto.

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

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

Confira também