Compartir a través de


Migración a DataContractSerializer (XML)

Las bibliotecas de clases base de .NET proporcionan dos serializadores XML: XmlSerializer y DataContractSerializer. Hay algunas diferencias sutiles entre estos dos, pero para el propósito de la migración, esta sección se centra solo en DataContractSerializer. ¿Por qué? Dado que es totalmente compatible con el modelo de programación de serialization que se utilizó en BinaryFormatter. Todos los tipos que ya están marcados como [Serializable] o implementados ISerializable se pueden serializar con DataContractSerializer. ¿Dónde está la trampa? Los tipos conocidos deben especificarse por adelantado. Debe conocerlos y poder obtener Type, incluso para tipos privados.

No es necesario especificar colecciones más populares o tipos primitivos como string o DateTime (el serializador tiene su propia lista de permitidos predeterminada), pero hay excepciones como DateTimeOffset. Para obtener más información sobre los tipos admitidos, vea Tipos admitidos por el serializador de contratos de datos.

La confianza parcial es una característica de .NET Framework que no se ha migrado a .NET (Core). Si el código se ejecuta en .NET Framework y usa esta característica, lea las limitaciones que podrían aplicarse a este escenario.

Migración paso a paso

  1. Busque todos los usos de BinaryFormatter.
  2. Asegúrese de que las rutas de acceso al código serialization estén cubiertas con pruebas, para que pueda verificar los cambios y evitar la introducción de errores.
  3. No es necesario instalar ningún paquete, ya que DataContractSerializer forma parte de las bibliotecas de .NET Core.
  4. Busque todos los tipos que se serializan con BinaryFormatter. No es necesario modificar ninguno de ellos, pero es posible que tenga que enumerarlos a través del argumento knownTypes del constructor DataContractSerializer.
  5. Reemplace el uso de BinaryFormatter por DataContractSerializer.
DataContractSerializer serializer = new(
    type: input.GetType(),
    knownTypes: new Type[]
    {
        typeof(MyType1),
        typeof(MyType2)
    });