Teilen über


SYSLIB0051: APIs mit Unterstützung für die Legacyserialisierung sind veraltet

Die folgenden APIs sind ab .NET 8 als veraltet gekennzeichnet. Wenn Sie diese im Code aufrufen, wird zur Kompilierzeit die Warnung SYSLIB0051 ausgelöst.

Eine vollständige Liste der betroffenen APIs finden Sie unter Veraltete APIs: SYSLIB0051.

Problemumgehung

  • Wenn Sie einen benutzerdefinierten Typ erstellt haben, der von System.Exception abgeleitet ist, sollten Sie erwägen, ob er wirklich serialisierbar sein muss. Er muss sehr wahrscheinlich nicht serialisierbar sein, da die Ausnahmeserialisierung in erster Linie zur Unterstützung von Remoting dient, die in .NET Core 1.0 eingestellt wurde.

    Wenn Ihr benutzerdefinierter Ausnahmetyp wie im folgenden Codeschnipsel definiert ist, entfernen Sie einfach das [Serializable]-Attribut, den Serialisierungskonstruktor und die Überschreibung der GetObjectData(SerializationInfo, StreamingContext)-Methode.

    [Serializable] // Remove this attribute.
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
    
        // Remove this constructor.
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
        // Remove this method.
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    

    Es kann vorkommen, dass Sie diese APIs nicht aus Ihrem benutzerdefinierten Ausnahmetyp entfernen können, z. B. wenn Sie eine Bibliothek erstellen, die durch API-Kompatibilitätsanforderungen eingeschränkt ist. In diesem Fall wird empfohlen, einen eigenen Serialisierungskonstruktor und die GetObjectData-Methoden mithilfe des Diagnosecodes in SYSLIB0051 als veraltet zu kennzeichnen, wie im folgenden Code gezeigt. Da die APIs im Idealfall nicht außerhalb der Serialisierungsinfrastruktur selbst aufgerufen werden, sollte sich die Kennzeichnung als veraltet nur auf andere Typen in der Unterklasse Ihres benutzerdefinierten Ausnahmetyps auswirken. Es sollte sich nicht viral auf Bereiche auswirken, in denen Ihr benutzerdefinierter Ausnahmetyp abgefangen, erstellt oder anderweitig verwendet wird.

    [Serializable]
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
    
        [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to the serialization ctor.
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
        [Obsolete(DiagnosticId = "SYSLIB0051")] // Add this attribute to GetObjectData.
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    

    Wenn Sie übergreifend auf .NET Framework und .NET 8 und höher abzielen, können Sie eine #if-Anweisung verwenden, um die Kennzeichnung als veraltet bedingt anzuwenden. Dies ist dieselbe Strategie, die das .NET-Team in der Codebasis für .NET-Bibliotheken anwendet, wenn es auf mehrere Runtimes abzielt.

    [Serializable]
    public class MyException : Exception
    {
        // ...
    
    #if NET8_0_OR_GREATER
        [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to the serialization ctor
    #endif
        protected MyException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            // ...
        }
    
    #if NET8_0_OR_GREATER
        [Obsolete(DiagnosticId = "SYSLIB0051")] // add this attribute to GetObjectData
    #endif
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // ...
    
            base.GetObjectData(info, context);
        }
    }
    
    
  • Wenn Sie einen Typ deklariert haben, der Unterklassen eines .NET-Typs erstellt, dem [Serializable] zugeordnet ist, und Sie SYSLIB0051-Warnungen erhalten, befolgen Sie den Leitfaden für benutzerdefinierte Ausnahmetypen im vorherigen Aufzählungspunkt.

Tipp

Wenn Ihr benutzerdefinierter [Serializable]-Typ keine Unterklasse eines .NET-Typs erstellt, werden keine SYSLIB0051-Warnungen angezeigt. Es wird jedoch davon abgeraten, Ihren Typ auf diese Weise zu kommentieren, da moderne Serialisierungsbibliotheken wie System.Text.Json dies nicht erfordern. Erwägen Sie, das [Serializable]-Attribut und die ISerializable-Schnittstelle zu entfernen. Verlassen Sie sich stattdessen darauf, dass Ihre Serialisierungsbibliothek auf Objekte des Typs über seine öffentlichen Eigenschaften und nicht über seine privaten Felder zugreifen kann.

Unterdrücken einer Warnung

Wenn Sie die veralteten APIs verwenden müssen, können Sie die Warnung im Code oder in Ihrer Projektdatei unterdrücken.

Um nur einen einzelnen Verstoß zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Warnung zu deaktivieren und dann wieder zu aktivieren.

// Disable the warning.
#pragma warning disable SYSLIB0051

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

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

Um alle SYSLIB0051-Warnungen in Ihrem Projekt zu unterdrücken, fügen Sie ihrer Projektdatei eine <NoWarn>-Eigenschaft hinzu.

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

Weitere Informationen finden Sie unter Unterdrücken von Warnungen.

Siehe auch