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.
- A mintát
.ctor(SerializationInfo, StreamingContext)
követő összes nyilvános vagy védett szerializálási konstruktor. Ilyen konstruktorra példa a Exception(SerializationInfo, StreamingContext). - A metódus összes implicit implementációja ISerializable.GetObjectData(SerializationInfo, StreamingContext) , például System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- A metódus összes implicit implementációja IObjectReference.GetRealObject(StreamingContext) , például System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
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 aSYSLIB0051
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 kapSYSLIB0051
, 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.