Condividi tramite


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.

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 restituisce false al momento del processo di serializzazione CodeDOM. (Nota: il metodo può avere un ambito private.)
  • 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.

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 per quanto riguarda la serializzazione o la deserializzazione , segnala un problema su github.com/dotnet/winforms in e specifica che il problema è legato alla rimozione di .