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.
- 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
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]
eISerializable
). 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 aISerializable
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.