Megosztás a következőn keresztül:


SYSLIB0051: Elavultak az örökölt szerializációs támogatási API-k

A következő API-k elavultak, a .NET 8-tól kezdve. A kódban való meghívás figyelmeztetést SYSLIB0051 generál fordításkor.

Az érintett API-k teljes listáját az Elavult API-k – SYSLIB0051 című témakörben találja.

Áthidaló megoldás

  • Ha létrehozott egy egyéni típust, amelyből System.Exceptionszármazik, fontolja meg, hogy valóban szükség van-e rá, hogy szerializálható legyen. Valószínű, hogy nincs szükség rá, hogy szerializálható legyen, mivel a kivétel szerializálása elsősorban az átnevezés támogatására szolgál, és az újramosztálás támogatása a .NET Core 1.0-ban csökkent.

    Ha az egyéni kivételtípus az alábbi kódrészletben láthatóhoz hasonlóan van definiálva, egyszerűen távolítsa el az [Serializable] attribútumot, a szerializálási konstruktort és a metódus felülbírálását 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);
        }
    }
    

    Előfordulhat, hogy ezeket az API-kat nem tudja eltávolítani az egyéni kivételtípusból, például ha api-kompatibilitási követelmények által korlátozott kódtárat hoz létre. Ebben az esetben a javaslat a saját szerializálási konstruktor és GetObjectData metódusok elavulttá tétele a SYSLIB0051 diagnosztikai kód használatával, ahogyan az az alábbi kódban is látható. Mivel ideális esetben a szerializálási infrastruktúrán kívül senki sem hívhatja meg ezeket az API-kat, az obsoletion csak az egyéni kivételtípus alosztályozására vonatkozó egyéb típusokat érintheti. Ez nem érintheti vírusosan az egyéni kivételtípust elkapó, összeállító vagy más módon használó bárkit.

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

    Ha a .NET-keretrendszer és a .NET 8+ célkeresztje, egy utasítás használatával #if feltételesen alkalmazhatja az obszoleciót. Ez ugyanaz a stratégia, amelyet a .NET-csapat a .NET-kódtárak kódbázisában használ a futtatókörnyezetek keresztcélzásakor.

    [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);
        }
    }
    
    
  • Ha olyan típust deklarált, amely alosztályozza a .NET-típust, és [Serializable] figyelmeztetéseket kap SYSLIB0051 , kövesse az előző felsoroláspontban szereplő egyéni kivételtípusokra vonatkozó útmutatást.

Tipp.

Ha az [Serializable] egyéni típus nem alosztályozza a .NET-típust, nem jelennek meg SYSLIB0051 figyelmeztetések. Javasoljuk azonban, hogy ilyen módon jegyzetelje meg a típust, mivel a modern szerializálási kódtárak nem igénylik System.Text.Json őket. Fontolja meg az attribútum és a [Serializable] felület eltávolítását ISerializable . Ehelyett használja a szerializálási kódtárat, hogy a privát mezők helyett a nyilvános tulajdonságain keresztül férhessen hozzá a típus objektumaihoz.

Figyelmeztetés mellőzése

Ha az elavult API-kat kell használnia, letilthatja a figyelmeztetést a kódban vagy a projektfájlban.

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz, hogy letiltsa, majd engedélyezze újra a figyelmeztetést.

// Disable the warning.
#pragma warning disable SYSLIB0051

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

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

Ha el szeretné tiltani a SYSLIB0051 projekt összes figyelmeztetését, adjon hozzá egy tulajdonságot <NoWarn> a projektfájlhoz.

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

További információ: Figyelmeztetések mellőzése.

Lásd még