Sdílet prostřednictvím


SYSLIB0051: Starší verze rozhraní API podpory serializace jsou zastaralá

Následující typy rozhraní API jsou zastaralé počínaje rozhraním .NET 8. Volání v kódu generuje upozornění SYSLIB0051 v době kompilace.

Úplný seznam ovlivněných rozhraní API najdete v tématu Zastaralá rozhraní API – SYSLIB0051.

Alternativní řešení

  • Pokud jste vytvořili vlastní typ odvozený z System.Exception, zvažte, zda opravdu potřebujete, aby byl serializovatelný. Je pravděpodobné, že ji nepotřebujete serializovat, protože serializace výjimek je primárně určena k podpoře vzdálené komunikace a podpora vzdálené komunikace byla vyřazena v .NET Core 1.0.

    Pokud je váš vlastní typ výjimky definovaný jako typ, který je zobrazený v následujícím fragmentu kódu, jednoduše odeberte [Serializable] atribut, konstruktor serializace a GetObjectData(SerializationInfo, StreamingContext) přepsání metody.

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

    V případech, kdy tato rozhraní API nemůžete odebrat z vlastního typu výjimky, například pokud vytvoříte knihovnu omezenou požadavky na kompatibilitu rozhraní API. V tomto případě doporučujeme zastaralé vlastní konstruktor serializace a GetObjectData metody pomocí diagnostického SYSLIB0051 kódu, jak je znázorněno v následujícím kódu. Vzhledem k tomu, že v ideálním případě by tato rozhraní API neměla volat nikdo mimo samotnou infrastrukturu serializace, měla by obsoletion ovlivnit pouze jiné typy, které podtřídy váš vlastní typ výjimky. Nemělo by to mít virální dopad na někoho, kdo chytá, vytváří nebo jinak používá váš vlastní typ výjimky.

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

    Pokud křížově cílíte pro rozhraní .NET Framework a .NET 8 nebo novější, můžete k podmíněnému použití obsolece použít #if příkaz. Jedná se o stejnou strategii, kterou tým .NET používá v základu kódu knihoven .NET při křížovém cílení modulů runtime.

    [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);
        }
    }
    
    
  • Pokud jste deklarovali typ, který podtřídí typ .NET, který je přiřazený [Serializable] a zobrazuje SYSLIB0051 se upozornění, postupujte podle pokynů pro vlastní typy výjimek v předchozím odrážkovém bodu.

Tip

Pokud váš [Serializable] vlastní typ není podtřídou typu .NET, nezobrazí SYSLIB0051 se upozornění. Doporučujeme ale, abyste tento typ neonotovali, protože moderní knihovny System.Text.Json serializace je nevyžadují. Zvažte odebrání atributu [Serializable]ISerializable a rozhraní. Místo toho se spoléháte na knihovnu serializace pro přístup k objektům typu prostřednictvím jeho veřejných vlastností, nikoli jeho privátních polí.

Potlačení upozornění

Pokud musíte použít zastaralá rozhraní API, můžete potlačit upozornění v kódu nebo v souboru projektu.

Chcete-li potlačit pouze jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, které chcete zakázat a znovu povolit upozornění.

// Disable the warning.
#pragma warning disable SYSLIB0051

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

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

Pokud chcete potlačit všechna SYSLIB0051 upozornění v projektu, přidejte <NoWarn> do souboru projektu vlastnost.

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

Další informace naleznete v tématu Potlačení upozornění.

Viz také