SYSLIB0050. Сериализация на основе форматирования устарела

Следующие API устарели, начиная с .NET 8. При вызове их в коде выдается предупреждение SYSLIB0050 во время компиляции.

Обходное решение

  • Если вы использовали 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>

Дополнительные сведения см. в разделе Отключение предупреждений.

См. также