Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
boolbytechardecimaldoubleintsbytefloat- TimeSpan
- DateTime
uintstringnintnuintlongulongshortushort- PointF
- RectangleF
Windows Forms también admite los siguientes tipos adicionales:
Escenarios de 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)
Designer de Windows Forms
El Designer 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 Designer 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 Designer.
- 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 devuelvefalseen el momento del proceso de serialización de CodeDOM. (Nota: el método puede tener un ámbito deprivate). - Esa propiedad es un tipo que no tiene un DesignerSerializer.
Si estas instrucciones se cumplen, el Designer determina si el tipo de esa propiedad tiene un convertidor de tipos. Si es así, el Designer 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 mediante MSBuild
Al generar archivos de recursos a través de MSBuild, podría producirse un MSB3825 error. Este error especifica que los recursos con formato binario se pueden deserializar mediante BinaryFormatter durante el tiempo de ejecución. La advertencia se quita de las compilaciones destinadas a .NET 9 y versiones posteriores, pero la eliminación aún no se ha completado en todas las versiones de .NET 9. La advertencia solo debe ser preocupante al tener como destino .NET 8 y versiones inferiores. Como se indicó anteriormente, estos recursos no deserializarán mediante BinaryFormatter durante el tiempo de ejecución en .NET 9 y versiones posteriores. Puede desactivar la advertencia estableciendo la propiedad GenerateResourceWarnOnBinaryFormatterUse a 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 BinaryFormatter la guía de migración: Paquete de compatibilidad. Tenga en cuenta que para usar System.Resources.Extensions.UseBinaryFormatter en los recursos, se requiere un paso adicional para establecer el modificador de contexto de la aplicación true a BinaryFormatter.
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 de 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 Designer 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.
Solución alternativa de compatibilidad (no recomendada)
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.
Issues
Si experimenta un comportamiento inesperado en su aplicación Windows Forms en lo relativo a la serialización o deserialización de BinaryFormatter, registre un problema en github.com/dotnet/winforms e indique que el problema está relacionado con la supresión de BinaryFormatter.