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.
- Všechny veřejné nebo chráněné serializační konstruktory, které se řídí vzorem
.ctor(SerializationInfo, StreamingContext)
. Příkladem takového konstruktoru je Exception(SerializationInfo, StreamingContext). - Všechny implicitní implementace ISerializable.GetObjectData(SerializationInfo, StreamingContext) metody, například System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- Všechny implicitní implementace IObjectReference.GetRealObject(StreamingContext) metody, například System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
Ú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éhoSYSLIB0051
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 zobrazujeSYSLIB0051
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í.