SYSLIB0050. Сериализация на основе форматирования устарела
Следующие API устарели, начиная с .NET 8. При вызове их в коде выдается предупреждение SYSLIB0050
во время компиляции.
- 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)
Обходное решение
Если вы использовали FormatterServices.GetUninitializedObject(Type), используйте RuntimeHelpers.GetUninitializedObject(Type) вместо этого.
При перекрестной компиляции для платформа .NET Framework и современной .NET можно использовать
#if
инструкцию для выборочного вызова соответствующего API, как показано в следующем фрагменте кода.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
Если вы пишете библиотеку сериализации, настоятельно рекомендуется использовать библиотеки сериализации, поддерживающие устаревшую инфраструктуру сериализации (
[Serializable]
иISerializable
). Современные библиотеки сериализации должны иметь политику на основе общедоступных API типа, а не его частных сведений о реализации. Если сериализатор основывается на этих деталях реализации и строго связываете егоISerializable
с другими механизмами, которые поощряют внедрение имен типов в сериализованные полезные данные, это может привести к проблемам, описанным в десериализации рисков использования BinaryFormatter и связанных типов.Если библиотека сериализации должна оставаться совместимой с устаревшей инфраструктурой сериализации, вы можете легко отключить устаревшие обзолы API сериализации.
Отключение предупреждений
Если необходимо использовать устаревшие API, вы можете отключить предупреждение в коде или в файле проекта.
Чтобы отключить только одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить предупреждение.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Чтобы отключить все SYSLIB0050
предупреждения в проекте, добавьте <NoWarn>
свойство в файл проекта.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Дополнительные сведения см. в разделе Отключение предупреждений.