Le API di serializzazione BinaryFormatter generano errori del compilatore
Nell'ambito del piano di deprecazione a lungo termine di BinaryFormatter, continuiamo con la dismissione della funzionalità BinaryFormatter
dalle nostre librerie e a disabituare gli sviluppatori all'uso di questo tipo. A partire da .NET 7, le chiamate alle API seguenti generano errori in fase di compilazione per tutti i tipi di progetto C# e Visual Basic:
- EventoSystem.Exception.SerializeObjectState
- Metodo BinaryFormatter.Serialize
- Metodo BinaryFormatter.Deserialize
- Metodo Formatter.Serialize(Stream, Object)
- Metodo Formatter.Deserialize(Stream)
- Metodo IFormatter.Serialize(Stream, Object)
- Metodo IFormatter.Deserialize(Stream)
Comportamento precedente
A partire da .NET 5, l'uso dei metodi Serialize
e Deserialize
interessati generava un avviso del compilatore con ID SYSLIB0011
. Per altre informazioni, vedere I metodi di serializzazione BinaryFormatter sono obsoleti e sono proibiti nelle app ASP.NET (.NET 5).
L'utilizzo dell'evento Exception.SerializeObjectState non generava un errore.
Nuovo comportamento
A partire da .NET 7, l'uso di una delle API interessate nel codice genera un errore del compilatore con lo stesso ID, SYSLIB0011
. Il progetto sarà interessato se soddisfa tutti i criteri seguenti:
- È un progetto C# o Visual Basic.
- È destinato a
net7.0
o versione successiva. - Chiama direttamente una delle API interessate.
- Non prevede già l'eliminazione del codice di avviso
SYSLIB0011
.
Versione di introduzione
.NET 7
Tipo di modifica che causa un'interruzione
Questa modifica può influire sulla compatibilità dell'origine.
Motivo della modifica
Nell'ambito del piano di deprecazione a lungo termine di BinaryFormatter, continuiamo con la dismissione della funzionalità BinaryFormatter
dalle nostre librerie e a disabituare gli sviluppatori all'uso di questo tipo.
Azione consigliata
La migliore linea di azione consiste nell'eseguire la migrazione da BinaryFormatter
a causa dei problemi di sicurezza e affidabilità. BinaryFormatter
potrebbe essere rimosso da .NET in una versione futura. Il team delle librerie .NET ha già preso posizione e i tipi recenti come System.Half e System.DateOnly non saranno compatibili con BinaryFormatter
.
Se è necessario eliminare gli errori, è possibile farlo seguendo le linee guida nell'articolo originale relativo all'obsolescenza. È anche possibile disabilitare l'errore a livello di progetto impostando una proprietà del progetto che converte l'errore in avviso (in modo che corrisponda al comportamento di .NET 5/6).
Avviso
L'impostazione di questa proprietà potrebbe modificare il comportamento dell'host. Vedere Proprietà < EnableUnsafeBinaryFormatterSerialization>.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Nota
Se il progetto viene compilato con l'opzione per considerare gli avvisi come errori abilitata, la compilazione avrà comunque esito negativo. (Questo corrisponde al comportamento disponibile negli SDK .NET 5 e .NET 6). In questo caso, sarà comunque necessario eliminare l'avviso SYSLIB0011
nell'origine o nell'elemento <NoWarn>
del file di progetto.
Proprietà <EnableUnsafeBinaryFormatterSerialization>
La proprietà <EnableUnsafeBinaryFormatterSerialization
è stata introdotta in .NET 5. Con .NET 7, il comportamento di questa opzione è stato modificato per controllare sia il comportamento di compilazione che di runtime dell'host. Il significato di questa opzione è diverso in base al tipo di progetto, come descritto nella tabella seguente.
Tipo di progetto | Proprietà impostata su true |
Proprietà impostata su false |
Proprietà omessa |
---|---|---|---|
Libreria/componente condiviso1 | Le API interessate sono obsolete come avviso. La compilazione avrà esito positivo a meno che non sia abilitata l'opzione per considerare gli avvisi come errori per l'applicazione o che il codice di avviso SYSLIB0011 non sia stato eliminato. |
Le API interessate sono obsolete come errore e le chiamate dal codice a tali API avranno esito negativo in fase di compilazione, a meno che l'errore non venga eliminato. | (Come per false .) |
App Blazor e MAUI2 | Le chiamate a BinaryFormatter avranno esito negativo in fase di esecuzione. |
Le chiamate a BinaryFormatter avranno esito negativo in fase di esecuzione. |
Le chiamate a BinaryFormatter avranno esito negativo in fase di esecuzione. |
App ASP.NET | Le API interessate sono obsolete come avviso. La compilazione avrà esito positivo a meno che non sia abilitata l'opzione per considerare gli avvisi come errori per l'applicazione o che il codice di avviso SYSLIB0011 non sia stato eliminato. Il runtime consentirà le chiamate a BinaryFormatter , indipendentemente dal fatto che la chiamata abbia origine dal codice o da una dipendenza utilizzata. |
Le API interessate sono obsolete come errore e le chiamate dal codice a tali API avranno esito negativo in fase di compilazione, a meno che l'errore non venga eliminato. Il runtime vieterà le chiamate a BinaryFormatter , indipendentemente dal fatto che la chiamata abbia origine dal codice o da una dipendenza utilizzata. |
(Come per false .) |
App desktop e tutti gli altri tipi di app | Le API interessate sono obsolete come avviso. La compilazione avrà esito positivo a meno che non sia abilitata l'opzione per considerare gli avvisi come errori per l'applicazione o che il codice di avviso SYSLIB0011 non sia stato eliminato. Il runtime consentirà le chiamate a BinaryFormatter , indipendentemente dal fatto che la chiamata abbia origine dal codice o da una dipendenza utilizzata. |
Le API interessate sono obsolete come errore e le chiamate dal codice a tali API avranno esito negativo in fase di compilazione, a meno che l'errore non venga eliminato. Il runtime vieterà le chiamate a BinaryFormatter , indipendentemente dal fatto che la chiamata abbia origine dal codice o da una dipendenza utilizzata. |
Le API interessate sono obsolete come errore e le chiamate dal codice a tali API avranno esito negativo in fase di compilazione, a meno che l'errore non venga eliminato. Il runtime consentirà le chiamate a BinaryFormatter , indipendentemente dal fatto che la chiamata abbia origine dal codice o da una dipendenza utilizzata. |
1I criteri di runtime sono controllati dall'host dell'app. Le chiamate a BinaryFormatter
potrebbero comunque non riuscire in fase di esecuzione anche se la proprietà <EnableUnsafeBinaryFormatterSerialization>
è impostata su true
all'interno del file di progetto della libreria. Le librerie non possono eseguire l'override dei criteri di runtime dell'host dell'app.
2I runtime Blazor e MAUI vietano le chiamate a BinaryFormatter
. Indipendentemente dal valore impostato per <EnableUnsafeBinaryFormatterSerialization>
, le chiamate avranno esito negativo in fase di esecuzione. Non chiamare queste API da applicazioni Blazor o MAUI o dalle librerie destinate a essere utilizzate da app Blazor o MAUI.
API interessate
- System.Exception.SerializeObjectState
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize
- System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
- System.Runtime.Serialization.Formatter.Serialize(Stream, Object)
- System.Runtime.Serialization.Formatter.Deserialize(Stream)
- System.Runtime.Serialization.IFormatter.Serialize(Stream, Object)
- System.Runtime.Serialization.IFormatter.Deserialize(Stream)