Compartir a través de


Guía de migración de Windows Forms para BinaryFormatter

Eliminación de BinaryFormatter

A partir de .NET 9, BinaryFormatter ya no se admite debido a sus riesgos de seguridad conocidos y sus API siempre arrojan una PlatformNotSupportedException para todos los tipos de proyectos, incluidas las aplicaciones Windows Forms. Para obtener más información sobre los riesgos de BinaryFormatter y el motivo de su eliminación, consulte la Guía de migración de BinaryFormatter.

Con la eliminación de BinaryFormatter, se espera que muchas aplicaciones de Windows Forms se vean afectadas y tendrá que tomar medidas para completar la migración a .NET 9 o una versión posterior.

Cómo BinaryFormatter afecta a Windows Forms

Antes de .NET 9, Windows Forms usaba BinaryFormatter para serializar y deserializar datos en escenarios como portapapeles, arrastrar y colocar, y cargar o almacenar recursos en el tiempo de diseño. A partir de .NET 9, Windows Forms y WPF usan un subconjunto de la implementación de BinaryFormatter internamente para estos escenarios. Aunque los riesgos de BinaryFormatter no se pueden abordar en la serialización o deserialización de uso general, se han adoptado medidas para mitigar los riesgos en estos casos de uso muy específicos con un conjunto conocido de tipos. Una reversión a todavía BinaryFormatter está en vigor para tipos desconocidos o no admitidos, lo que producirá excepciones a menos que se realicen los pasos de migración en la aplicación.

Windows Forms y las aplicaciones WPF controlan los siguientes tipos, junto con matrices y listas de estos tipos. Los recursos de Portapapeles, arrastrar y colocar, y tiempo de diseño seguirán funcionando con estos tipos sin necesidad de realizar los pasos de migración.

Windows Forms también admite los siguientes tipos adicionales:

Escenarios OLE

Para obtener información sobre los efectos que la eliminación de BinaryFormatter tiene en escenarios OLE, como portapapeles y arrastrar y colocar, así como instrucciones de migración, consulte la Guía de Windows Formsy Windows Presentation Foundation BinaryFormatter OLE.

Recursos (ResX)

Diseñador de Windows Forms

El diseñador de Windows Forms Out-Of-Process también usa BinaryFormatter internamente para la serialización y deserialización de ResX.

Los tipos y propiedades pueden participar en la serialización sin que se dé cuenta debido al comportamiento estándar del diseñador de Windows Forms. Una manera de usar BinaryFormatter que puede que se le pase por alto es cuando se introduce una propiedad public en un IComponent y esa propiedad se rellena o edita en el tiempo de diseño. Esa propiedad se serializa en los archivos de recursos en las condiciones siguientes:

  • Una propiedad pública contiene datos en el momento en que se guarda un Form en el Diseñador.
  • Esa propiedad no es de solo lectura.
  • Esa propiedad no se atribuye a [DesignerSerializationVisibility(false)].
  • Esa propiedad no tiene un DefaultValueAttribute.
  • Esa propiedad no tiene un método de bool ShouldSerialize[PropertyName] respectivo que devuelve false en el momento del proceso de serialización de CodeDOM. (Nota: el método puede tener un ámbito de private).
  • Esa propiedad es un tipo que no tiene un DesignerSerializer.

Si estas instrucciones se cumplen, el Diseñador determina si el tipo de esa propiedad tiene un convertidor de tipos. Si es así, el Diseñador utiliza el convertidor de tipos para serializar el contenido de la propiedad. De lo contrario, utiliza BinaryFormatter para serializar el contenido en el archivo de recursos. Windows Forms ha agregado analizadores junto con correcciones de código para dar a conocer este tipo de comportamiento en el que la serialización de BinaryFormatter puede producirse sin el conocimiento del desarrollador.

Carga de recursos durante el tiempo de ejecución

Los tipos que se habían serializado previamente en archivos de recursos a través de BinaryFormatter seguirán deserializándose según lo previsto sin necesidad de BinaryFormatter, ya que el contenido de los archivos ResX se considera que son datos de confianza. En el caso excepcional de que la deserialización no pueda producirse sin BinaryFormatter, se puede volver a agregar con un paquete de compatibilidad no admitido. Para obtener más información, consulte la Guía de migración de BinaryFormatter: Paquete de compatibilidad. Tenga en cuenta que se requiere un paso adicional para establecer el cambio de contexto de la aplicación de System.Resources.Extensions.UseBinaryFormatter a true para usar BinaryFormatter para los recursos.

Generación de archivos de recursos a través de msbuild

Al generar archivos de recursos a través de msbuild, puede producirse el error MSB3825, que especifica que los recursos con formato binario se pueden deserializar mediante BinaryFormatter durante el tiempo de ejecución. Como se indicó anteriormente, estos recursos no deserializarán mediante BinaryFormatter y esta advertencia se puede desactivar estableciendo la propiedad GenerateResourceWarnOnBinaryFormatterUse en false. En el caso excepcional de que la deserialización no pueda producirse sin BinaryFormatter, se puede volver a agregar con un paquete de compatibilidad no admitido. Para obtener más información, consulte la Guía de migración de BinaryFormatter: Paquete de compatibilidad. Tenga en cuenta que se requiere un paso adicional para establecer el cambio de contexto de la aplicación de System.Resources.Extensions.UseBinaryFormatter a true para usar BinaryFormatter para los recursos.

Migración desde BinaryFormatter

Si los tipos que no se controlan intrínsecamente durante la serialización y la deserialización se usan en los escenarios afectados, deberá realizar acciones para completar la migración a .NET 9 o a una versión posterior.

Escenarios OLE

Consulte la Guía de Windows Forms y Windows Presentation Foundation BinaryFormatter OLE para obtener más información sobre cómo migrar desde BinaryFormatter en escenarios como portapapeles y arrastrar y colocar.

Carga y guardado de recursos durante el tiempo de diseño

Para los tipos que no se controlan intrínsecamente durante la serialización en recursos, como en el caso de los escenarios del Diseñador con ResX, la forma prescrita de migrar desde BinaryFormatter es asegurarse de que se haya registrado un TypeConverter para el tipo o la propiedad que participa en la serialización. De este modo, durante la serialización y deserialización, se usa el TypeConverter donde se usaba el BinaryFormatter. Para obtener más información sobre cómo implementar un convertidor de tipos, consulte Clase de TypeConverter.

Los usuarios de .NET 9 que no pueden migrar desde BinaryFormatter pueden instalar un paquete de compatibilidad no compatible. Para obtener más información, consulte la Guía de migración de BinaryFormatter: Paquete de compatibilidad.

Precaución

BinaryFormatter es peligroso y no se recomienda, ya que pone en riesgo el consumo de aplicaciones en riesgo de ataques como denegación de servicio (DoS), divulgación de información o ejecución remota de código. Para obtener más información sobre los riesgos de BinaryFormatter, consulte Riesgos de deserialización en el uso de BinaryFormatter y tipos relacionados.

Problemas

Si experimenta un comportamiento inesperado con su aplicación Windows Forms con respecto a la serialización o la deserialización de BinaryFormatter, registre un problema en github.com/dotnet/winforms e indique que el problema está relacionado con la eliminación de BinaryFormatter.