SYSLIB0050 : la sérialisation basée sur le formateur est obsolète

Les API suivantes sont obsolètes, à compter de .NET 8. Leur appel dans le code génère un avertissement SYSLIB0050 au moment de la compilation.

Solution de contournement

  • Si vous utilisiez FormatterServices.GetUninitializedObject(Type), utilisez plutôt RuntimeHelpers.GetUninitializedObject(Type).

    Si vous effectuez une compilation croisée pour .NET Framework et .NET moderne, vous pouvez utiliser une instruction #if pour appeler de manière sélective l’API appropriée, comme indiqué dans l’extrait de code suivant.

    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 vous écrivez une bibliothèque de sérialisation, nous vous recommandons vivement d’éviter les bibliothèques de sérialisation qui prennent en charge l’infrastructure de sérialisation héritée ([Serializable] et ISerializable). Les bibliothèques de sérialisation modernes doivent avoir une stratégie basée sur les API publiques d’un type plutôt que sur ses détails d’implémentation privée. Si vous basez un sérialiseur sur ces détails d’implémentation et que vous le liez fortement à ISerializable et à d’autres mécanismes qui encouragent l’incorporation de noms de types dans la charge utile sérialisée, cela peut entraîner les problèmes décrits dans Risques de désérialisation dans l’utilisation de BinaryFormatter et des types associés.

    Si votre bibliothèque de sérialisation doit rester compatible avec l’infrastructure de sérialisation héritée, vous pouvez facilement supprimer les obsolescences d’API de sérialisation héritées.

Supprimer un avertissement

Si vous devez utiliser les API obsolètes, vous pouvez supprimer l’avertissement dans le code ou dans votre fichier projet.

Pour supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver, puis réactiver l’avertissement.

// Disable the warning.
#pragma warning disable SYSLIB0050

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0050

Pour supprimer tous les avertissements SYSLIB0050 dans votre projet, ajoutez une propriété <NoWarn> à votre fichier projet.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
  </PropertyGroup>
</Project>

Pour plus d’informations, consultez Supprimer des avertissements.

Voir aussi