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.
- System.Runtime.Serialization.FormatterConverter
- System.Runtime.Serialization.FormatterServices
- System.Runtime.Serialization.IFormatterConverter
- System.Runtime.Serialization.IObjectReference
- System.Runtime.Serialization.ISafeSerializationData
- System.Runtime.Serialization.ISerializationSurrogate
- System.Runtime.Serialization.ISurrogateSelector
- System.Runtime.Serialization.ObjectIDGenerator
- System.Runtime.Serialization.ObjectManager
- System.Runtime.Serialization.SafeSerializationEventArgs
- System.Runtime.Serialization.SerializationObjectManager
- System.Runtime.Serialization.StreamingContextStates
- System.Runtime.Serialization.SurrogateSelector
- System.Runtime.Serialization.Formatters.FormatterAssemblyStyle
- System.Runtime.Serialization.Formatters.FormatterTypeStyle
- System.Runtime.Serialization.Formatters.IFieldInfo
- System.Runtime.Serialization.Formatters.TypeFilterLevel
- System.Type.IsSerializable
- System.Reflection.FieldAttributes.NotSerialized
- System.Reflection.FieldInfo.IsNotSerialized
- System.Reflection.TypeAttributes.Serializable
- System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo, StreamingContext)
- SerializationInfo(Type, IFormatterConverter, Boolean)
- SerializationInfo(Type, IFormatterConverter)
- StreamingContext(StreamingContextStates, Object)
- StreamingContext(StreamingContextStates)
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]
eISerializable
). 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 aISerializable
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.