SYSLIB0050: La serialización basada en formateador está obsoleta
Las siguientes API están obsoletas a partir de .NET 8. Si se los llama en el código, se genera la advertencia SYSLIB0050
en tiempo de compilación.
- 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)
Solución alternativa
Si va a usar FormatterServices.GetUninitializedObject(Type), use mejor RuntimeHelpers.GetUninitializedObject(Type).
Si realiza compilaciones cruzadas para .NET Framework y .NET moderno, puede usar una instrucción
#if
para llamar selectivamente a la API adecuada, como se muestra en el siguiente fragmento de código.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
Si está escribiendo una biblioteca de serialización, se recomienda encarecidamente usar bibliotecas de serialización que admitan la infraestructura de serialización heredada (
[Serializable]
yISerializable
). Las bibliotecas de serialización modernas deben tener directivas basadas en las API públicas de un tipo en lugar de sus detalles de implementación privada. Si basa un serializador en estos detalles de implementación y lo vincula fuertemente aISerializable
y a otros mecanismos que fomentan la inserción de nombres de tipo dentro de la carga serializada, puede provocar los problemas descritos en Riesgos de deserialización durante el uso de BinaryFormatter y tipos relacionados.Si la biblioteca de serialización debe seguir siendo compatible con la infraestructura de serialización heredada, puede suprimir fácilmente las obsolescencias de la API de serialización heredada.
Supresión de una advertencia
Si tiene que seguir usando las API obsoletas, puede suprimir la advertencia en el código o en el archivo de proyecto.
Para suprimir solo una infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y luego volver a habilitar la advertencia.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Para suprimir todas las advertencias SYSLIB0050
del proyecto, agregue una propiedad <NoWarn>
al archivo del proyecto.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Para obtener más información, vea Suprimir advertencias.