SYSLIB0051: API:er för äldre serialiseringsstöd är föråldrade
Följande typer av API:er är föråldrade, med början i .NET 8. Att anropa dem i kod genererar en varning SYSLIB0051
vid kompileringstillfället.
- Alla offentliga eller skyddade serialiseringskonstruktorer som följer mönstret
.ctor(SerializationInfo, StreamingContext)
. Ett exempel på en sådan konstruktor är Exception(SerializationInfo, StreamingContext). - Alla implicita implementeringar av ISerializable.GetObjectData(SerializationInfo, StreamingContext) metoden, till exempel System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- Alla implicita implementeringar av IObjectReference.GetRealObject(StreamingContext) metoden, till exempel System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
En fullständig lista över berörda API:er finns i Föråldrade API:er – SYSLIB0051.
Lösning
Om du har skapat en anpassad typ som härletts från System.Exceptionkan du överväga om du verkligen behöver den som serialiserbar. Det är troligt att du inte behöver det för att vara serialiserbar, eftersom undantagsserialisering främst är avsedd att stödja fjärrkommunikation och stöd för fjärrkommunikation har tagits bort i .NET Core 1.0.
Om din anpassade undantagstyp definieras som den som visas i följande kodfragment tar du helt enkelt bort
[Serializable]
attributet, serialiseringskonstruktorn och metoden åsidosätter 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); } }
Det kan finnas fall där du inte kan ta bort dessa API:er från din anpassade undantagstyp, till exempel om du skapar ett bibliotek som är begränsat av API-kompatibilitetskrav. I det här fallet är rekommendationen att föråldrade egna serialiseringskonstruktor och
GetObjectData
metoder med hjälp avSYSLIB0051
diagnostikkoden, som visas i följande kod. Eftersom ingen utanför själva serialiseringsinfrastrukturen bör anropa dessa API:er bör obsoletion endast påverka andra typer som underklassar din anpassade undantagstyp. Det bör inte påverka någon som fångar, konstruerar eller på annat sätt använder din anpassade undantagstyp.[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); } }
Om du korsmålar för .NET Framework och .NET 8+, kan du använda en
#if
instruktion för att tillämpa obsoletionen villkorsstyrt. Det här är samma strategi som .NET-teamet använder i kodbasen för .NET-bibliotek vid korsmålskörningar.[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); } }
Om du har deklarerat en typ som underklassar en .NET-typ som tillskrivs
[Serializable]
och du fårSYSLIB0051
varningar följer du riktlinjerna för anpassade undantagstyper i föregående punkt.
Dricks
Om din [Serializable]
anpassade typ inte underklassar en .NET-typ visas SYSLIB0051
inte varningar. Vi rekommenderar dock att du inte kommenterar din typ på det här sättet, eftersom moderna serialiseringsbibliotek som System.Text.Json
inte kräver dem. Överväg att [Serializable]
ta bort attributet och ISerializable
gränssnittet. Förlita dig i stället på serialiseringsbiblioteket för att få åtkomst till objekt av typen via dess offentliga egenskaper i stället för dess privata fält.
Ignorera en varning
Om du måste använda föråldrade API:er kan du ignorera varningen i koden eller i projektfilen.
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och återaktiverar sedan varningen.
// Disable the warning.
#pragma warning disable SYSLIB0051
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0051
Om du vill ignorera alla SYSLIB0051
varningar i projektet lägger du till en <NoWarn>
egenskap i projektfilen.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
</PropertyGroup>
</Project>
Mer information finns i Utelämna varningar.