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:

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.

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

Vea también