SYSLIB0050: Formatiererbasierte Serialisierung veraltet
Die folgenden APIs sind ab .NET 8 veraltet. Wenn Sie diese im Code aufrufen, wird zur Kompilierzeit die Warnung SYSLIB0050
ausgelöst.
- 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)
Problemumgehung
Wenn Sie FormatterServices.GetUninitializedObject(Type) verwendet haben, verwenden Sie stattdessen RuntimeHelpers.GetUninitializedObject(Type).
Wenn Sie für .NET Framework und modernes .NET gleichzeitig kompilieren, können Sie eine
#if
-Anweisung verwenden, um die passende API selektiv aufzurufen, wie im folgenden Codeschnipsel gezeigt.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
Wenn Sie eine Serialisierungsbibliothek schreiben, wird dringend davon abgeraten, Serialisierungsbibliotheken zu verwenden, die die Legacy-Serialisierungsinfrastruktur (
[Serializable]
undISerializable
) unterstützen. Moderne Serialisierungsbibliotheken sollten über eine Richtlinie verfügen, die auf den öffentlichen APIs eines Typs und nicht auf Details der privaten Implementierung basiert. Wenn Sie einen Serialisierer auf diesen Implementierungsdetails aufbauen und ihn stark anISerializable
und andere Mechanismen binden, die das Einbetten von Typnamen in serialisierte Nutzdaten fördern, kann dies zu den Problemen führen, die unter Deserialisierungsrisiken bei der Verwendung von BinaryFormatter und verwandten Typen beschrieben sind.Wenn Ihre Serialisierungsbibliothek mit der Legacy-Serialisierungsinfrastruktur kompatibel bleiben muss, können Sie die Kennzeichnung von Legacyserialisierungs-API als veraltet problemlos unterdrücken.
Unterdrücken einer Warnung
Wenn Sie die veralteten APIs verwenden müssen, können Sie die Warnung im Code oder in Ihrer Projektdatei unterdrücken.
Um nur einen einzelnen Verstoß zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Warnung zu deaktivieren und dann wieder zu aktivieren.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Um alle SYSLIB0050
-Warnungen in Ihrem Projekt zu unterdrücken, fügen Sie ihrer Projektdatei eine <NoWarn>
-Eigenschaft hinzu.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Weitere Informationen finden Sie unter Unterdrücken von Warnungen.