Dela via


SYSLIB0051: API:er för äldre serialiseringsstöd är föråldrade

Följande typer av API:er är föråldrade, med början i .NET 8. Att anropa dem i kod genererar en varning SYSLIB0051 vid kompileringstillfället.

En fullständig lista över berörda API:er finns i Föråldrade API:er – SYSLIB0051.

Lösning

  • Om du har skapat en anpassad typ som härletts från System.Exceptionkan du överväga om du verkligen behöver den som serialiserbar. Det är troligt att du inte behöver det för att vara serialiserbar, eftersom undantagsserialisering främst är avsedd att stödja fjärrkommunikation och stöd för fjärrkommunikation har tagits bort i .NET Core 1.0.

    Om din anpassade undantagstyp definieras som den som visas i följande kodfragment tar du helt enkelt bort [Serializable] attributet, serialiseringskonstruktorn och metoden åsidosätter GetObjectData(SerializationInfo, StreamingContext) .

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

    Det kan finnas fall där du inte kan ta bort dessa API:er från din anpassade undantagstyp, till exempel om du skapar ett bibliotek som är begränsat av API-kompatibilitetskrav. I det här fallet är rekommendationen att föråldrade egna serialiseringskonstruktor och GetObjectData metoder med hjälp av SYSLIB0051 diagnostikkoden, som visas i följande kod. Eftersom ingen utanför själva serialiseringsinfrastrukturen bör anropa dessa API:er bör obsoletion endast påverka andra typer som underklassar din anpassade undantagstyp. Det bör inte påverka någon som fångar, konstruerar eller på annat sätt använder din anpassade undantagstyp.

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

    Om du korsmålar för .NET Framework och .NET 8+, kan du använda en #if instruktion för att tillämpa obsoletionen villkorsstyrt. Det här är samma strategi som .NET-teamet använder i kodbasen för .NET-bibliotek vid korsmålskörningar.

    [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);
        }
    }
    
    
  • Om du har deklarerat en typ som underklassar en .NET-typ som tillskrivs [Serializable] och du får SYSLIB0051 varningar följer du riktlinjerna för anpassade undantagstyper i föregående punkt.

Dricks

Om din [Serializable] anpassade typ inte underklassar en .NET-typ visas SYSLIB0051 inte varningar. Vi rekommenderar dock att du inte kommenterar din typ på det här sättet, eftersom moderna serialiseringsbibliotek som System.Text.Json inte kräver dem. Överväg att [Serializable] ta bort attributet och ISerializable gränssnittet. Förlita dig i stället på serialiseringsbiblioteket för att få åtkomst till objekt av typen via dess offentliga egenskaper i stället för dess privata fält.

Ignorera en varning

Om du måste använda föråldrade API:er kan du ignorera varningen i koden eller i projektfilen.

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och återaktiverar sedan varningen.

// Disable the warning.
#pragma warning disable SYSLIB0051

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

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

Om du vill ignorera alla SYSLIB0051 varningar i projektet lägger du till en <NoWarn> egenskap i projektfilen.

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

Mer information finns i Utelämna varningar.

Se även