SYSLIB0050: Serializace založená na formátovacím formátu je zastaralá
Následující rozhraní API jsou zastaralá počínaje rozhraním .NET 8. Volání v kódu generuje upozornění SYSLIB0050
v době kompilace.
- 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)
Alternativní řešení
Pokud jste používali FormatterServices.GetUninitializedObject(Type), použijte RuntimeHelpers.GetUninitializedObject(Type) místo toho.
Pokud křížově kompilujete rozhraní .NET Framework a moderní rozhraní .NET, můžete pomocí
#if
příkazu selektivně volat příslušné rozhraní API, jak je znázorněno v následujícím fragmentu kódu.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
Pokud píšete knihovnu serializace, důrazně doporučujeme použít knihovny serializace, které podporují starší infrastrukturu serializace (
[Serializable]
aISerializable
). Moderní knihovny serializace by měly mít zásady založené na veřejných rozhraních API typu, nikoli na podrobnostech jeho privátní implementace. Pokud na těchto podrobnostech implementace založíte serializátor a silně je propojíte sISerializable
dalšími mechanismy, které podporují vkládání názvů typů v serializované datové části, může vést k problémům popsaným v rizikech deserializace při použití BinaryFormatter a souvisejících typů.Pokud vaše knihovna serializace musí zůstat kompatibilní s infrastrukturou serializace starší verze, můžete snadno potlačit zastaralé serializační rozhraní API obsoletions.
Potlačení upozornění
Pokud musíte použít zastaralá rozhraní API, můžete potlačit upozornění v kódu nebo v souboru projektu.
Chcete-li potlačit pouze jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, které chcete zakázat a znovu povolit upozornění.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Pokud chcete potlačit všechna SYSLIB0050
upozornění v projektu, přidejte <NoWarn>
do souboru projektu vlastnost.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Další informace naleznete v tématu Potlačení upozornění.