Las API de serialización BinaryFormatter producen errores del compilador
Dentro del plan de retirada a largo plazo de BinaryFormatter, seguimos quitando funcionalidad de BinaryFormatter
de nuestras bibliotecas y apartando a los desarrolladores de este tipo. A partir de .NET 7, las llamadas a las siguientes API generan errores en tiempo de compilación en todos los tipos de proyecto de C# y Visual Basic:
- EventoSystem.Exception.SerializeObjectState
- Método BinaryFormatter.Serialize
- Método BinaryFormatter.Deserialize
- Método Formatter.Serialize(Stream, Object)
- Método Formatter.Deserialize(Stream)
- Método IFormatter.Serialize(Stream, Object)
- Método IFormatter.Deserialize(Stream)
Comportamiento anterior
Desde .NET 5, el uso de los métodos Serialize
y Deserialize
afectados producía una advertencia del compilador con el id. SYSLIB0011
. Para obtener más información, consulte Los métodos de serialización BinaryFormatter están obsoletos y se prohíben en las aplicaciones ASP.NET (.NET 5).
El uso del evento Exception.SerializeObjectState no producía ningún error.
Comportamiento nuevo
A partir de .NET 7, el uso de cualquiera de las API afectadas en el código genera un error del compilador con el mismo id., SYSLIB0011
. El proyecto se verá afectado si cumple todos los criterios siguientes:
- Es un proyecto de C# o Visual Basic.
- Tiene como destino
net7.0
o posterior. - Llama directamente a una de las API afectadas.
- Aún no suprime el código de advertencia
SYSLIB0011
.
Versión introducida
.NET 7
Tipo de cambio importante
Este cambio puede afectar a la compatibilidad de orígenes.
Motivo del cambio
Dentro del plan de retirada a largo plazo de BinaryFormatter, seguimos quitando funcionalidad de BinaryFormatter
de nuestras bibliotecas y apartando a los desarrolladores de este tipo.
Acción recomendada
La mejor medida es migrar de BinaryFormatter
, debido a sus defectos de seguridad y confiabilidad. Es posible que BinaryFormatter
se quite de .NET en una versión futura. El equipo de las bibliotecas de .NET ya ha decidido que los tipos recientes, como System.Half y System.DateOnly, no serán compatibles con BinaryFormatter
.
Si debe suprimir los errores, puede hacerlo siguiendo las instrucciones que se proporcionan en el artículo sobre la obsolescencia original. También puede deshabilitar el error en todo el proyecto estableciendo una propiedad de proyecto que vuelva a convertir el error en una advertencia (para que coincida con el comportamiento de .NET 5/6).
Advertencia
Al establecer esta propiedad, puede cambiar el comportamiento del host. Consulte Propiedad <EnableUnsafeBinaryFormatterSerialization>.
<PropertyGroup>
...
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
Nota
Si el proyecto se compila con la opción "Advertencias como errores" habilitada, la compilación seguirá dando error. Esto coincide con el comportamiento de los SDK de .NET 5 y .NET 6. Si es así, deberá suprimir la advertencia SYSLIB0011
en el código fuente o en el elemento <NoWarn>
del archivo del proyecto.
Propiedad <EnableUnsafeBinaryFormatterSerialization>
La propiedad <EnableUnsafeBinaryFormatterSerialization
se introdujo en .NET 5. Con .NET 7, el comportamiento de este modificador ha cambiado para controlar el comportamiento en tiempo de ejecución tanto de la compilación como del host. El significado de este modificador difiere en función del tipo de proyecto, como se describe en la siguiente tabla.
Tipo de proyecto | Propiedad establecida en true |
Propiedad establecida en false |
Propiedad omitida |
---|---|---|---|
Biblioteca/componente compartido1 | Las API afectadas están obsoletas como advertencia. La compilación se realizará correctamente a menos que tenga habilitada la opción "Advertencias como errores" para la aplicación o haya suprimido el código de advertencia SYSLIB0011 . |
Las API afectadas están obsoletas como error y las llamadas desde el código a esas API producirán un error en tiempo de compilación, a menos que se suprima el error. | Igual que para false . |
Aplicaciones de Blazor y MAUI2 | Las llamadas a BinaryFormatter darán error en tiempo de ejecución. |
Las llamadas a BinaryFormatter darán error en tiempo de ejecución. |
Las llamadas a BinaryFormatter darán error en tiempo de ejecución. |
Aplicación ASP.NET | Las API afectadas están obsoletas como advertencia. La compilación se realizará correctamente a menos que tenga habilitada la opción "Advertencias como errores" para la aplicación o haya suprimido el código de advertencia SYSLIB0011 . El entorno de ejecución permitirá llamadas a BinaryFormatter , independientemente de si la llamada se origina en el código o en una dependencia que consuma. |
Las API afectadas están obsoletas como error y las llamadas desde el código a esas API producirán un error en tiempo de compilación, a menos que se suprima el error. El entorno de ejecución prohibirá las llamadas a BinaryFormatter , independientemente de si la llamada se origina en el código o en una dependencia que consuma. |
Igual que para false . |
Aplicaciones de escritorio y todos los demás tipos de aplicaciones | Las API afectadas están obsoletas como advertencia. La compilación se realizará correctamente a menos que tenga habilitada la opción "Advertencias como errores" para la aplicación o haya suprimido el código de advertencia SYSLIB0011 . El entorno de ejecución permitirá llamadas a BinaryFormatter , independientemente de si la llamada se origina en el código o en una dependencia que consuma. |
Las API afectadas están obsoletas como error y las llamadas desde el código a esas API producirán un error en tiempo de compilación, a menos que se suprima el error. El entorno de ejecución prohibirá las llamadas a BinaryFormatter , independientemente de si la llamada se origina en el código o en una dependencia que consuma. |
Las API afectadas están obsoletas como error y las llamadas desde el código a esas API producirán un error en tiempo de compilación, a menos que se suprima el error. El entorno de ejecución permitirá llamadas a BinaryFormatter , independientemente de si la llamada se origina en el código o en una dependencia que consuma. |
1 La directiva en tiempo de ejecución se controla con el host de aplicaciones. Las llamadas a BinaryFormatter
pueden dar error en tiempo de ejecución incluso si se establece <EnableUnsafeBinaryFormatterSerialization>
en true
en el archivo de proyecto de la biblioteca. Las bibliotecas no pueden invalidar la directiva en tiempo de ejecución del host de aplicaciones.
2 Los entornos de ejecución de Blazor y MAUI prohíben las llamadas a BinaryFormatter
. Independientemente del valor que establezca para <EnableUnsafeBinaryFormatterSerialization>
, las llamadas darán error en tiempo de ejecución. No llame a estas API desde aplicaciones de Blazor o MAUI ni desde bibliotecas pensadas para que las consuman estas aplicaciones.
API afectadas
- 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)