SYSLIB0050: Formateringsbaserad serialisering är föråldrad
Följande API:er är föråldrade, med början i .NET 8. Att anropa dem i kod genererar en varning SYSLIB0050
vid kompileringstillfället.
- 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)
Lösning
Om du använder använder FormatterServices.GetUninitializedObject(Type)RuntimeHelpers.GetUninitializedObject(Type) du i stället.
Om du korskompilerar för .NET Framework och modern .NET kan du använda en
#if
instruktion för att selektivt anropa lämpligt API, enligt följande kodfragment.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
Om du skriver ett serialiseringsbibliotek rekommenderar vi starkt mot serialiseringsbibliotek som stöder den äldre serialiseringsinfrastrukturen (
[Serializable]
ochISerializable
). Moderna serialiseringsbibliotek bör ha en princip som baseras på en typs offentliga API:er i stället för dess privata implementeringsinformation. Om du baserar en serialiserare på den här implementeringsinformationen och starkt kopplar den tillISerializable
och andra mekanismer som uppmuntrar till inbäddning av typnamn i den serialiserade nyttolasten kan det leda till de problem som beskrivs i Deserialiseringsrisker vid användning av BinaryFormatter och relaterade typer.Om serialiseringsbiblioteket måste vara kompatibelt med den äldre serialiseringsinfrastrukturen kan du enkelt utelämna äldre serialiserings-API-obsoletioner.
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 SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Om du vill ignorera alla SYSLIB0050
varningar i projektet lägger du till en <NoWarn>
egenskap i projektfilen.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Mer information finns i Utelämna varningar.