SYSLIB0051: Verouderde serialisatieondersteunings-API's zijn verouderd
De volgende soorten API's zijn verouderd, te beginnen in .NET 8. Als u deze in code aanroept, wordt er een waarschuwing SYSLIB0051
gegenereerd tijdens het compileren.
- Alle openbare of beveiligde serialisatieconstructors die het patroon
.ctor(SerializationInfo, StreamingContext)
volgen. Een voorbeeld van een dergelijke constructor is Exception(SerializationInfo, StreamingContext). - Alle impliciete implementaties van de ISerializable.GetObjectData(SerializationInfo, StreamingContext) methode, bijvoorbeeld System.Exception.GetObjectData(SerializationInfo, StreamingContext).
- Alle impliciete implementaties van de IObjectReference.GetRealObject(StreamingContext) methode, bijvoorbeeld System.Reflection.ParameterInfo.GetRealObject(StreamingContext).
Zie Verouderde API's - SYSLIB0051 voor een volledige lijst met betrokken API's.
Tijdelijke oplossing
Als u een aangepast type hebt gemaakt dat is afgeleid van System.Exception, kunt u overwegen of u het echt nodig hebt om deze te serializeerbaar te maken. Het is waarschijnlijk dat u deze niet nodig hebt om serialiseerbaar te zijn, omdat uitzonderingsserialisatie voornamelijk bedoeld is om externe communicatie te ondersteunen en ondersteuning voor externe communicatie is verwijderd in .NET Core 1.0.
Als uw aangepaste uitzonderingstype is gedefinieerd zoals in het volgende codefragment, verwijdert u gewoon het
[Serializable]
kenmerk, de serialisatieconstructor en de GetObjectData(SerializationInfo, StreamingContext) methode overschrijven.[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); } }
Er zijn mogelijk gevallen waarin u deze API's niet kunt verwijderen uit uw aangepaste uitzonderingstype, bijvoorbeeld als u een bibliotheek produceert die is beperkt door api-compatibiliteitsvereisten. In dit geval is de aanbeveling uw eigen serialisatieconstructor en
GetObjectData
-methoden verouderd met behulp van deSYSLIB0051
diagnostische code, zoals wordt weergegeven in de volgende code. Omdat in het ideale geval niemand buiten de serialisatie-infrastructuur zelf deze API's moet aanroepen, moet obsoletion alleen van invloed zijn op andere typen die uw aangepaste uitzonderingstype subklassen. Het mag geen virale gevolgen hebben voor iemand die uw aangepaste uitzonderingstype onderschept, maakt of anderszins gebruikt.[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); } }
Als u een kruislings doel voor .NET Framework en .NET 8+ gebruikt, kunt u een
#if
instructie gebruiken om de obsoletion voorwaardelijk toe te passen. Dit is dezelfde strategie die het .NET-team gebruikt in de codebasis van .NET-bibliotheken wanneer runtimes kruislings worden gericht.[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); } }
Als u een type hebt gedeclareerd waarmee een .NET-type wordt geclassificeerd
[Serializable]
waaraan u waarschuwingen krijgtSYSLIB0051
, volgt u de richtlijnen voor aangepaste uitzonderingstypen in het vorige opsommingsteken.
Tip
Als uw [Serializable]
aangepaste type geen subklasse van een .NET-type heeft, ziet SYSLIB0051
u geen waarschuwingen. We raden u echter aan om op deze manier aantekeningen te maken bij uw type, omdat System.Text.Json
moderne serialisatiebibliotheken ze niet nodig hebben. Overweeg het [Serializable]
kenmerk en de ISerializable
interface te verwijderen. Vertrouw in plaats daarvan op uw serialisatiebibliotheek om toegang te krijgen tot objecten van het type via de openbare eigenschappen in plaats van de persoonlijke velden.
Een waarschuwing onderdrukken
Als u de verouderde API's moet gebruiken, kunt u de waarschuwing in code of in het projectbestand onderdrukken.
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de waarschuwing uit te schakelen en vervolgens opnieuw in te schakelen.
// Disable the warning.
#pragma warning disable SYSLIB0051
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0051
Als u alle SYSLIB0051
waarschuwingen in uw project wilt onderdrukken, voegt u een <NoWarn>
eigenschap toe aan het projectbestand.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0051</NoWarn>
</PropertyGroup>
</Project>
Zie Waarschuwingen onderdrukken voor meer informatie.