SYSLIB0050: Serialisatie op basis van formatter is verouderd
De volgende API's zijn verouderd, te beginnen in .NET 8. Als u deze in code aanroept, wordt er een waarschuwing SYSLIB0050
gegenereerd tijdens het compileren.
- System.Runtime.Serialization.FormatterConverter
- System.Runtime.Serialization.FormatterServices
- System.Runtime.Serialization.IFormatterConverter
- System.Runtime.Serialization.IObjectReference
- System.Runtime.Serialization.ISafeSerializationData
- System.Runtime.Serialization.ISerializationSurrogate
- System.Runtime.Serialization.ISurrogateSelector
- System.Runtime.Serialization.ObjectIDGenerator
- System.Runtime.Serialization.ObjectManager
- System.Runtime.Serialization.SafeSerializationEventArgs
- System.Runtime.Serialization.SerializationObjectManager
- System.Runtime.Serialization.StreamingContextStates
- System.Runtime.Serialization.SurrogateSelector
- System.Runtime.Serialization.Formatters.FormatterAssemblyStyle
- System.Runtime.Serialization.Formatters.FormatterTypeStyle
- System.Runtime.Serialization.Formatters.IFieldInfo
- System.Runtime.Serialization.Formatters.TypeFilterLevel
- System.Type.IsSerializable
- System.Reflection.FieldAttributes.NotSerialized
- System.Reflection.FieldInfo.IsNotSerialized
- System.Reflection.TypeAttributes.Serializable
- System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo, StreamingContext)
- SerializationInfo(Type, IFormatterConverter, Boolean)
- SerializationInfo(Type, IFormatterConverter)
- StreamingContext(StreamingContextStates, Object)
- StreamingContext(StreamingContextStates)
Tijdelijke oplossing
Als u het gebruikte FormatterServices.GetUninitializedObject(Type), gebruikt RuntimeHelpers.GetUninitializedObject(Type) u in plaats daarvan.
Als u kruislings compileert voor .NET Framework en modern .NET, kunt u een
#if
instructie gebruiken om de juiste API selectief aan te roepen, zoals wordt weergegeven in het volgende fragment.Type typeToInstantiate; #if NET5_0_OR_GREATER object obj = System.Runtime.CompilerServices.RuntimeHelpers.GetUninitializedObject(typeToInstantiate); #else object obj = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeToInstantiate); #endif
Als u een serialisatiebibliotheek schrijft, raden we u ten zeerste aan om serialisatiebibliotheken te gebruiken die ondersteuning bieden voor de verouderde serialisatie-infrastructuur (
[Serializable]
enISerializable
). Moderne serialisatiebibliotheken moeten beleid hebben op basis van de openbare API's van een type in plaats van de details van de persoonlijke implementatie. Als u een serialisatiefunctie baseeert op deze implementatiedetails en deze sterk koppelt aanISerializable
en andere mechanismen die het insluiten van typenamen binnen de geserialiseerde nettolading aanmoedigen, kan dit leiden tot de problemen die worden beschreven in Deserialization-risico's bij het gebruik van BinaryFormatter en gerelateerde typen.Als uw serialisatiebibliotheek compatibel moet blijven met de verouderde serialisatie-infrastructuur, kunt u de verouderde serialisatie-API-buitenzoolingen eenvoudig onderdrukken .
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 SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Als u alle SYSLIB0050
waarschuwingen in uw project wilt onderdrukken, voegt u een <NoWarn>
eigenschap toe aan het projectbestand.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Zie Waarschuwingen onderdrukken voor meer informatie.