Serialización (C#)

La serialización es el proceso de convertir un objeto en una secuencia de bytes para almacenarlo o transmitirlo a la memoria, a una base de datos o a un archivo. Su propósito principal es guardar el estado de un objeto para poder volver a crearlo cuando sea necesario. El proceso inverso se denomina deserialización.

Funcionamiento de la serialización

En esta ilustración se muestra el proceso general de la serialización:

Gráfico serialización

El objeto se serializa en una secuencia que incluye los datos. La secuencia también puede tener información sobre el tipo del objeto, como la versión, la referencia cultural y el nombre del ensamblado. A partir de esa secuencia, el objeto se puede almacenar en una base de datos, en un archivo o en memoria.

Usos de la serialización

La serialización permite al desarrollador guardar el estado de un objeto y volver a crearlo según sea necesario, ya que proporciona almacenamiento de los objetos e intercambio de datos. A través de la serialización, un desarrollador puede realizar acciones como las siguientes:

  • Enviar el objeto a una aplicación remota mediante un servicio web
  • Pasar un objeto de un dominio a otro
  • Pasar un objeto a través de un firewall como una cadena JSON o XML
  • Mantener la seguridad o información específica del usuario entre aplicaciones

Serialización de JSON

El espacio de nombres System.Text.Json contiene clases para la serialización y deserialización de notación de objetos JavaScript (JSON). JSON es un estándar abierto que se usa normalmente para compartir datos en la web.

La serialización de JSON serializa las propiedades públicas de un objeto en una cadena, una matriz de bytes o una secuencia que se ajusta a la especificación de JSON RFC 8259. Para controlar la forma en que JsonSerializer serializa o deserializa una instancia de la clase:

Serialización XML y binaria

El espacio de nombres System.Runtime.Serialization contiene clases para la serialización y deserialización binaria y XML.

La serialización binaria utiliza la codificación binaria para generar una serialización compacta para usos como almacenamiento o secuencias de red basadas en socket. En la serialización binaria se serializan todos los miembros, incluso aquellos que son de solo lectura, y mejora el rendimiento.

Advertencia

La serialización binaria puede ser peligrosa. Para obtener más información, consulte la Guía de seguridad BinaryFormatter.

La serialización XML serializa las propiedades y los campos públicos de un objeto o los parámetros y valores devueltos de los métodos en una secuencia XML que se ajusta a un documento específico del lenguaje de definición de esquema XML (XSD). La serialización XML produce clases fuertemente tipadas cuyas propiedades y campos públicos se convierten a XML. System.Xml.Serialization contiene clases para serializar y deserializar XML. Se aplican atributos a clases y a miembros de clase para controlar la forma en que XmlSerializer serializa o deserializa una instancia de la clase.

Conversión de un objeto en serializable

Para la serialización binaria o XML, necesita lo siguiente:

Aplique el atributo SerializableAttribute a un tipo para indicar que se pueden serializar instancias de este tipo. Si se intenta serializar pero el tipo no tiene el atributo SerializableAttribute, se produce una excepción.

Para evitar que un campo se serialice, aplique el atributo NonSerializedAttribute. Si un campo de un tipo serializable contiene un puntero, un controlador o alguna otra estructura de datos específica para un entorno concreto y el campo no se puede reconstituir correctamente en un entorno diferente, puede convertirlo en no serializable.

Si una clase serializada contiene referencias a objetos de otras clases marcadas como SerializableAttribute, esos objetos también se serializarán.

Serialización básica y personalizada

La serialización binaria y XML se puede realizar de dos formas: de manera básica y personalizada.

La serialización básica utiliza .NET para serializar automáticamente el objeto. El único requisito es que la clase tenga el atributo SerializableAttribute aplicado. NonSerializedAttribute puede usarse para impedir la serialización de campos específicos.

Cuando se usa la serialización básica, el control de versiones de objetos puede causar problemas. Use la serialización personalizada si los problemas de control de versiones son importantes. La serialización básica es la manera más fácil de realizar la serialización, pero no proporciona mucho control sobre el proceso.

En la serialización personalizada, puede especificar exactamente qué objetos se serializarán y cómo se llevará a cabo la serialización. La clase debe marcarse como SerializableAttribute e implementar la interfaz ISerializable. Si quiere que el objeto también se deserialice de forma personalizada, use un constructor personalizado.

Serialización de diseñador

La serialización de diseñador es una forma especial de serialización que conlleva el tipo de persistencia de objeto asociado a las herramientas de desarrollo. La serialización de diseñador es un proceso que consiste en convertir un gráfico de objetos en un archivo de código fuente que puede utilizarse posteriormente para recuperar el gráfico de objetos. Un archivo de código fuente puede contener código, marcado o incluso información de la tabla SQL.

En Información general de System.Text.Json se muestra cómo obtener la biblioteca System.Text.Json.

En Procedimiento para serializar y deserializar JSON en .NET se muestra cómo leer y escribir datos de objetos a y desde JSON mediante la clase JsonSerializer.

Tutorial: Conservar un objeto en Visual Studio (C#)
Se explica cómo se puede usar la serialización para conservar los datos de un objeto entre instancias, lo que le permite almacenar valores y recuperarlos la próxima vez que se cree una instancia del objeto.

Procedimiento para leer datos de objeto de un archivo XML (C#)
Se muestra cómo leer los datos de objetos que se han escrito anteriormente en un archivo XML con la clase XmlSerializer.

Procedimiento para escribir datos de objeto en un archivo XML (C#)
Se muestra cómo escribir el objeto de una clase en un archivo XML con la clase XmlSerializer.