SYSLIB0050: serializacja oparta na formatowaniu jest przestarzała
Następujące interfejsy API są przestarzałe, począwszy od platformy .NET 8. Wywołanie ich w kodzie generuje ostrzeżenie SYSLIB0050
w czasie kompilacji.
- 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)
Rozwiązanie
Jeśli używasz polecenia FormatterServices.GetUninitializedObject(Type), użyj polecenia RuntimeHelpers.GetUninitializedObject(Type) zamiast tego.
W przypadku kompilowania krzyżowego dla platformy .NET Framework i nowoczesnej platformy .NET można użyć instrukcji
#if
, aby selektywnie wywołać odpowiedni interfejs API, jak pokazano w poniższym fragmencie kodu.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
Jeśli piszesz bibliotekę serializacji, zdecydowanie zalecamy stosowanie bibliotek serializacji obsługujących starszą infrastrukturę serializacji (
[Serializable]
iISerializable
). Nowoczesne biblioteki serializacji powinny mieć zasady oparte na publicznych interfejsach API typu, a nie na jego prywatnych szczegółach implementacji. W przypadku oparcia serializatora na tych szczegółach implementacji i silnie związane z nim i innych mechanizmów, które zachęcają doISerializable
osadzania nazw typów w serializowanym ładunku, może to prowadzić do problemów opisanych w temacie Ryzyko deserializacji w użyciu binaryFormatter i powiązanych typów.Jeśli biblioteka serializacji musi pozostać zgodna ze starszą infrastrukturą serializacji, można łatwo pominąć starsze obsoletions interfejsu API serializacji.
Pomijanie ostrzeżenia
Jeśli musisz używać przestarzałych interfejsów API, możesz pominąć ostrzeżenie w kodzie lub w pliku projektu.
Aby pominąć tylko jedno naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć ostrzeżenie.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Aby pominąć wszystkie SYSLIB0050
ostrzeżenia w projekcie, dodaj <NoWarn>
właściwość do pliku projektu.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Aby uzyskać więcej informacji, zobacz Pomijanie ostrzeżeń.