Windows Forms guida alla migrazione per BinaryFormatter
BinaryFormatter rimozione
A partire da .NET 9, BinaryFormatter non è più supportato a causa dei rischi noti per la sicurezza e le API generano sempre un'eccezione PlatformNotSupportedException per tutti i tipi di progetto, incluse Windows Forms le app. Per maggiori informazioni sui rischi di BinaryFormatter e sul motivo della rimozione, consultare la BinaryFormatter guida alla migrazione.
Con la rimozione di BinaryFormatter, è previsto che molte applicazioni Windows Forms siano interessate e sarà necessario intervenire per completare la migrazione a .NET 9 o a una versione successiva.
Come BinaryFormatter influisce su Windows Forms
Prima di .NET 9, Windows Forms usava BinaryFormatter per serializzare e deserializzare i dati per scenari quali appunti, trascinamento della selezione e archiviazione o caricamento delle risorse in fase di progettazione. A partire da .NET 9, Windows Forms e WPF usano un subset dell'implementazione BinaryFormatter internamente per questi scenari. Anche se i rischi di BinaryFormatter non possono essere affrontati nella serializzazione/deserializzazione per utilizzo generico, sono state adottate misure per attenuare i rischi in questi casi d'uso molto specifici con un set noto di tipi. Il fallback a BinaryFormatter è ancora disponibile per i tipi sconosciuti o non supportati, che genereranno eccezioni a meno che non vengano eseguiti passaggi di migrazione nell'applicazione.
Le app Windows Forms e WPF gestiscono entrambi i tipi seguenti, insieme a matrici ed elenchi di questi tipi. Gli appunti, il trascinamento della selezione e le risorse in fase di progettazione continueranno a funzionare con questi tipi senza alcuna procedura di migrazione necessaria.
bool
byte
char
decimal
double
int
sbyte
float
- TimeSpan
- DateTime
uint
string
nint
nuint
long
ulong
short
ushort
- PointF
- RectangleF
Windows Forms supporta anche i tipi aggiuntivi seguenti:
Scenari di OLE
Per informazioni sugli effetti che la rimozione di BinaryFormatter ha sugli scenari OLE, ad esempio gli appunti e il trascinamento della selezione, nonché sulla guida alla migrazione, vedere la sezione Windows Forms e le linee guida OLE BinaryFormatter per Windows Presentation Foundation.
Risorse (ResX)
Lo strumento di progettazione di Windows Forms
Lo strumento di progettazione Windows Forms Out-Of-Orocess usa BinaryFormatter internamente anche per la serializzazione e la deserializzazione ResX.
I tipi e le proprietà possono partecipare alla serializzazione senza che l'utente se ne accorga a causa del comportamento standard dello strumento di progettazione Windows Forms. Un modo in cui BinaryFormatter viene usato in maniera inconsapevole è quando viene introdotta una proprietà public
in un oggetto IComponent e tale proprietà viene popolata o modificata in fase di progettazione. Tale proprietà viene serializzata in file di risorse nelle condizioni seguenti:
- Una proprietà pubblica contiene dati al momento del salvataggio di un Form nello Strumento di progettazione.
- Tale proprietà non è di sola lettura.
- Tale proprietà non è attribuita a
[DesignerSerializationVisibility(false)]
. - Tale proprietà non ha un DefaultValueAttribute.
- Tale proprietà non dispone di un metodo corrispondente
bool ShouldSerialize[PropertyName]
che restituiscefalse
al momento del processo di serializzazione CodeDOM. (Nota: il metodo può avere un ambitoprivate
.) - Tale proprietà è un tipo che non dispone di un DesignerSerializer
Se queste istruzioni sono true, lo Strumento di progettazione determina se il tipo di tale proprietà dispone di un convertitore di tipi. In caso affermativo, lo Strumento di progettazione usa il convertitore di tipi per serializzare i contenuti della proprietà. In caso contrario, usa BinaryFormatter per serializzare i contenuti nel file di risorse. Windows Forms ha aggiunto analizzatori insieme alle correzioni del codice che consentono di acquisire consapevolezza di questo tipo di comportamento in cui BinaryFormatter la serializzazione potrebbe verificarsi senza che lo sviluppatore ne sia a conoscenza.
Caricamento della risorsa durante il runtime
I tipi che in precedenza erano stati serializzati in file di risorse tramite BinaryFormatter continueranno a deserializzare come previsto senza la necessità di BinaryFormatter perché i contenuti dei file ResX sono considerati dati attendibili. Nel raro caso in cui la deserializzazione non possa verificarsi senza BinaryFormatter, può essere aggiunta di nuovo con un pacchetto di compatibilità non supportato. Per informazioni dettagliate, consultare la BinaryFormatterguida alla migrazione: Pacchetto di compatibilità. Si noti che è necessario un passaggio aggiuntivo per impostare System.Resources.Extensions.UseBinaryFormatter
il contesto dell'app per true
l'uso di BinaryFormatter per le risorse.
Generazione di file di risorse tramite msbuild
Quando si generano file di risorse tramite msbuild, è possibile che si verifichi un MSB3825
errore che specifica che le risorse in formato binario possono essere deserializzate usando BinaryFormatter durante il runtime. Come indicato in precedenza, queste risorse non deserializzeranno usando BinaryFormatter e questo avviso può essere disattivato impostando la proprietà GenerateResourceWarnOnBinaryFormatterUse
su false
. Nei rari casi in cui la deserializzazione non possa verificarsi senza BinaryFormatter, può essere aggiunta di nuovo con un pacchetto di compatibilità non supportato. Per informazioni dettagliate, consultare la BinaryFormatterguida alla migrazione: Pacchetto di compatibilità. Si noti che è necessario un passaggio aggiuntivo per impostare System.Resources.Extensions.UseBinaryFormatter
il contesto dell'app per true
l'uso di BinaryFormatter per le risorse.
Eseguire la migrazione da BinaryFormatter
Se i tipi non gestiti intrinsecamente durante la serializzazione e la deserializzazione vengono usati negli scenari interessati, è necessario intervenire per completare la migrazione a .NET 9 o a una versione successiva.
Scenari di OLE
Consultare le Windows FormsLinee guida OLE BinaryFormatterdi Windows Presentation Foundation per maggiori informazioni su come eseguire la migrazione da BinaryFormatter in scenari come appunti e trascinamento della selezione.
Caricamento e salvataggio delle risorse durante la fase di progettazione
Per i tipi che non vengono gestiti intrinsecamente durante la serializzazione in risorse, ad esempio nel caso dello Strumento di progettazione con scenari ResX, il modo previsto per eseguire la migrazione da BinaryFormatter consiste nel garantire che sia registrato un TypeConverter
per il tipo o la proprietà che partecipa alla serializzazione. In questo modo, durante la serializzazione e la deserializzazione, viene utilizzato TypeConverter
al posto di dove veniva usato una volta BinaryFormatter. Per maggiori informazioni sull'implementazione di un convertitore di tipi, consultare la sezione TypeConverter
Classe.
Soluzione alternativa alla compatibilità (non consigliata)
Gli utenti di .NET 9 che non possono eseguire la migrazione da BinaryFormatter possono installare un pacchetto di compatibilità non supportato. Per maggiori informazioni, consultare la BinaryFormatterguida alla migrazione: Pacchetto compatibilità.
Attenzione
BinaryFormatter è pericoloso e non consigliato perché mette a rischio l'uso di app a rischio di attacchi, ad esempio Denial of Service (DoS), divulgazione di informazioni o esecuzione remota di codice. Per maggiori informazioni sui rischi BinaryFormatter, consultare la sezione Rischi di deserializzazione in uso di BinaryFormatter e tipi correlati.
Problemi
Se riscontri un comportamento imprevisto con la tua app