Udostępnij za pośrednictwem


SYSLIB0051: starsze interfejsy API obsługi serializacji są przestarzałe

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

Aby uzyskać pełną listę dotkniętych interfejsów API, zobacz Przestarzałe interfejsy API — SYSLIB0051.

Rozwiązanie

  • Jeśli utworzono typ niestandardowy pochodzący z System.Exceptionklasy , należy rozważyć, czy naprawdę trzeba go serializować. Prawdopodobnie nie trzeba jej serializować, ponieważ serializacja wyjątków jest przeznaczona głównie do obsługi komunikacji wirtualnej, a obsługa komunikacji wirtualnej została porzucona na platformie .NET Core 1.0.

    Jeśli niestandardowy typ wyjątku jest zdefiniowany jak ten pokazany w poniższym fragmencie kodu, po prostu usuń [Serializable] atrybut, konstruktor serializacji i metodę GetObjectData(SerializationInfo, StreamingContext) zastąpienia.

    [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);
        }
    }
    

    Mogą wystąpić przypadki, w których nie można usunąć tych interfejsów API z niestandardowego typu wyjątku, na przykład w przypadku utworzenia biblioteki ograniczonej przez wymagania zgodności interfejsu API. W takim przypadku zaleceniem jest przestarzał własny konstruktor serializacji i GetObjectData metody przy użyciu kodu diagnostycznego SYSLIB0051 , jak pokazano w poniższym kodzie. Ponieważ w idealnym przypadku nikt poza samą infrastrukturą serializacji nie powinien wywoływać tych interfejsów API, obsoletion powinien mieć wpływ tylko na inne typy, które podklasują niestandardowy typ wyjątku. Nie powinno to mieć wpływu na nikogo, kto przechwytuje, konstruuje lub w inny sposób używa niestandardowego typu wyjątku.

    [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);
        }
    }
    

    Jeśli cross-target dla platform .NET Framework i .NET 8+, możesz użyć instrukcji #if , aby zastosować obsoletion warunkowo. Jest to ta sama strategia, która jest używana przez zespół platformy .NET w bazie kodu bibliotek platformy .NET w przypadku środowisk uruchomieniowych przeznaczonych dla różnych elementów docelowych.

    [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);
        }
    }
    
    
  • Jeśli zadeklarowaliśmy typ, który podklasuje typ platformy .NET przypisany [Serializable] i otrzymujesz SYSLIB0051 ostrzeżenia, postępuj zgodnie ze wskazówkami dotyczącymi niestandardowych typów wyjątków w poprzednim punkcie.

Napiwek

[Serializable] Jeśli typ niestandardowy nie ma podklasy typu .NET, nie zobaczysz SYSLIB0051 ostrzeżeń. Zalecamy jednak dodawanie adnotacji do typu w ten sposób, ponieważ nowoczesne biblioteki serializacji, takie jak System.Text.Json nie wymagają ich. Rozważ usunięcie atrybutu [Serializable] i interfejsu ISerializable . Zamiast tego polegaj na bibliotece serializacji, aby uzyskać dostęp do obiektów typu za pośrednictwem jego właściwości publicznych, a nie jego pól prywatnych.

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 SYSLIB0051

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

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

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

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

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

Zobacz też