Delen via


SYSLIB0051: Verouderde serialisatieondersteunings-API's zijn verouderd

De volgende soorten API's zijn verouderd, te beginnen in .NET 8. Als u deze in code aanroept, wordt er een waarschuwing SYSLIB0051 gegenereerd tijdens het compileren.

Zie Verouderde API's - SYSLIB0051 voor een volledige lijst met betrokken API's.

Tijdelijke oplossing

  • Als u een aangepast type hebt gemaakt dat is afgeleid van System.Exception, kunt u overwegen of u het echt nodig hebt om deze te serializeerbaar te maken. Het is waarschijnlijk dat u deze niet nodig hebt om serialiseerbaar te zijn, omdat uitzonderingsserialisatie voornamelijk bedoeld is om externe communicatie te ondersteunen en ondersteuning voor externe communicatie is verwijderd in .NET Core 1.0.

    Als uw aangepaste uitzonderingstype is gedefinieerd zoals in het volgende codefragment, verwijdert u gewoon het [Serializable] kenmerk, de serialisatieconstructor en de GetObjectData(SerializationInfo, StreamingContext) methode overschrijven.

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

    Er zijn mogelijk gevallen waarin u deze API's niet kunt verwijderen uit uw aangepaste uitzonderingstype, bijvoorbeeld als u een bibliotheek produceert die is beperkt door api-compatibiliteitsvereisten. In dit geval is de aanbeveling uw eigen serialisatieconstructor en GetObjectData -methoden verouderd met behulp van de SYSLIB0051 diagnostische code, zoals wordt weergegeven in de volgende code. Omdat in het ideale geval niemand buiten de serialisatie-infrastructuur zelf deze API's moet aanroepen, moet obsoletion alleen van invloed zijn op andere typen die uw aangepaste uitzonderingstype subklassen. Het mag geen virale gevolgen hebben voor iemand die uw aangepaste uitzonderingstype onderschept, maakt of anderszins gebruikt.

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

    Als u een kruislings doel voor .NET Framework en .NET 8+ gebruikt, kunt u een #if instructie gebruiken om de obsoletion voorwaardelijk toe te passen. Dit is dezelfde strategie die het .NET-team gebruikt in de codebasis van .NET-bibliotheken wanneer runtimes kruislings worden gericht.

    [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);
        }
    }
    
    
  • Als u een type hebt gedeclareerd waarmee een .NET-type wordt geclassificeerd [Serializable] waaraan u waarschuwingen krijgt SYSLIB0051 , volgt u de richtlijnen voor aangepaste uitzonderingstypen in het vorige opsommingsteken.

Tip

Als uw [Serializable] aangepaste type geen subklasse van een .NET-type heeft, ziet SYSLIB0051 u geen waarschuwingen. We raden u echter aan om op deze manier aantekeningen te maken bij uw type, omdat System.Text.Json moderne serialisatiebibliotheken ze niet nodig hebben. Overweeg het [Serializable] kenmerk en de ISerializable interface te verwijderen. Vertrouw in plaats daarvan op uw serialisatiebibliotheek om toegang te krijgen tot objecten van het type via de openbare eigenschappen in plaats van de persoonlijke velden.

Een waarschuwing onderdrukken

Als u de verouderde API's moet gebruiken, kunt u de waarschuwing in code of in het projectbestand onderdrukken.

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de waarschuwing uit te schakelen en vervolgens opnieuw in te schakelen.

// Disable the warning.
#pragma warning disable SYSLIB0051

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

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

Als u alle SYSLIB0051 waarschuwingen in uw project wilt onderdrukken, voegt u een <NoWarn> eigenschap toe aan het projectbestand.

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

Zie Waarschuwingen onderdrukken voor meer informatie.

Zie ook