Udostępnij za pośrednictwem


SYSLIB0050: serializacja oparta na formatowaniu jest przestarzała

Następujące interfejsy API są przestarzałe, począwszy od platformy .NET 8. Wywołanie ich w kodzie generuje ostrzeżenie SYSLIB0050 w czasie kompilacji.

Rozwiązanie

  • Jeśli używasz polecenia FormatterServices.GetUninitializedObject(Type), użyj polecenia RuntimeHelpers.GetUninitializedObject(Type) zamiast tego.

    W przypadku kompilowania krzyżowego dla platformy .NET Framework i nowoczesnej platformy .NET można użyć instrukcji #if , aby selektywnie wywołać odpowiedni interfejs API, jak pokazano w poniższym fragmencie kodu.

    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
    
  • Jeśli piszesz bibliotekę serializacji, zdecydowanie zalecamy stosowanie bibliotek serializacji obsługujących starszą infrastrukturę serializacji ([Serializable] i ISerializable). Nowoczesne biblioteki serializacji powinny mieć zasady oparte na publicznych interfejsach API typu, a nie na jego prywatnych szczegółach implementacji. W przypadku oparcia serializatora na tych szczegółach implementacji i silnie związane z nim i innych mechanizmów, które zachęcają do ISerializable osadzania nazw typów w serializowanym ładunku, może to prowadzić do problemów opisanych w temacie Ryzyko deserializacji w użyciu binaryFormatter i powiązanych typów.

    Jeśli biblioteka serializacji musi pozostać zgodna ze starszą infrastrukturą serializacji, można łatwo pominąć starsze obsoletions interfejsu API serializacji.

Pomijanie ostrzeżenia

Jeśli musisz używać przestarzałych interfejsów API, możesz pominąć ostrzeżenie w kodzie lub w pliku projektu.

Aby pominąć tylko jedno naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć ostrzeżenie.

// Disable the warning.
#pragma warning disable SYSLIB0050

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

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

Aby pominąć wszystkie SYSLIB0050 ostrzeżenia w projekcie, dodaj <NoWarn> właściwość do pliku projektu.

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

Aby uzyskać więcej informacji, zobacz Pomijanie ostrzeżeń.

Zobacz też