SYSLIB0050: La serializzazione basata su formattatore è obsoleta
Le API seguenti sono obsolete, a partire da .NET 8. La loro chiamata nel codice genera un avviso SYSLIB0050
in fase di compilazione.
- 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)
Soluzione alternativa
Se si usa FormatterServices.GetUninitializedObject(Type), usare invece RuntimeHelpers.GetUninitializedObject(Type) .
Se si esegue la compilazione incrociata per .NET Framework e .NET moderno, è possibile usare un'istruzione
#if
per chiamare in modo selettivo l'API appropriata, come illustrato nel frammento di codice seguente.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
Se si scrive una libreria di serializzazione, è consigliabile usare librerie di serializzazione che supportano l'infrastruttura di serializzazione legacy (
[Serializable]
eISerializable
). Le librerie di serializzazione moderne devono avere criteri basati sulle API pubbliche di un tipo anziché sui dettagli dell'implementazione privata. Se si basa un serializzatore su questi dettagli di implementazione e lo si associa saldamente aISerializable
e ad altri meccanismi che incoraggiano l'incorporamento dei nomi dei tipi all'interno del payload serializzato, questo può causare i problemi descritti in Rischi di deserializzazione nell'uso di BinaryFormatter e dei tipi correlati.Se la libreria di serializzazione deve rimanere compatibile con l'infrastruttura di serializzazione legacy, è possibile eliminare facilmente l'API di serializzazione legacy obsoleta.
Eliminare un avviso
Se è necessario usare le API obsolete, è possibile eliminare l'avviso nel codice o nel file di progetto.
Per eliminare solo una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare l'avviso.
// Disable the warning.
#pragma warning disable SYSLIB0050
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0050
Per eliminare tutti gli avvisi SYSLIB0050
nel progetto, aggiungere una proprietà <NoWarn>
al file di progetto.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0050</NoWarn>
</PropertyGroup>
</Project>
Per altre informazioni, vedere Non visualizzare gli avvisi.