Condividi tramite


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.

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] e ISerializable). 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 a ISerializable 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.

Vedi anche