Serialización de objetos en C# (.NET): JSON, XML y Binary
La serialización es el proceso de convertir un objeto complejo (o un grafo de objetos) en un flujo de bytes o un formato de texto (JSON, XML). Esto es necesario para guardar el estado de un objeto en un archivo, transmitir datos a través de la red (REST API, gRPC) o almacenarlos en caché. El proceso inverso, la deserialización, restaura el objeto a partir de su representación serializada. En el ecosistema .NET (incluyendo .NET Core y .NET 5/6/7/8), existen varios mecanismos de serialización integrados.
1. System.Text.Json — serialización moderna en JSON
A partir de .NET Core 3.0, Microsoft recomienda usar System.Text.Json como la forma principal de trabajar con JSON. La biblioteca es ligera, de alto rendimiento y no requiere dependencias de terceros (a diferencia de Newtonsoft.Json).
Ejemplo básico de serialización y deserialización
using System;using System.Text.Json;
public class Person{ public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies { get; set; }}
class Program{ static void Main() { var person = new Person { Name = "Alekséi", Age = 30, Hobbies = new List<string> { "Lectura", "Programación" } };
// Serialización string json = JsonSerializer.Serialize(person); Console.WriteLine(json); // {"Name":"Alekséi","Age":30,"Hobbies":["Lectura","Programación"]}
// Deserialización Person restored = JsonSerializer.Deserialize<Person>(json); Console.WriteLine(restored.Name); // Alekséi }}Configuración de la serialización con atributos
Puede controlar los nombres de las propiedades en JSON, ignorar valores nulos o usar convertidores personalizados:
using System.Text.Json.Serialization;
public class Product{ [JsonPropertyName("product_id")] public int Id { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Description { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))] public Status Status { get; set; }}
public enum Status { Active, Inactive }2. XmlSerializer — serialización en XML
La clase XmlSerializer (espacio de nombres System.Xml.Serialization) está disponible en todas las versiones de .NET y es ideal para la compatibilidad con sistemas heredados o archivos de configuración XML.
Ejemplo de trabajo con XmlSerializer
using System;using System.IO;using System.Xml.Serialization;
[XmlRoot("Employee")]public class Employee{ [XmlElement("FullName")] public string Name { get; set; }
[XmlAttribute("id")] public int Id { get; set; }
[XmlArray("Projects")] [XmlArrayItem("Project")] public List<string> Projects { get; set; }}
class Program{ static void Main() { var emp = new Employee { Id = 101, Name = "María Ivanova", Projects = new List<string> { "Alpha", "Beta" } };
var serializer = new XmlSerializer(typeof(Employee)); using (var writer = new StreamWriter("employee.xml")) { serializer.Serialize(writer, emp); }
// Deserialización using (var reader = new StreamReader("employee.xml")) { Employee restored = (Employee)serializer.Deserialize(reader); Console.WriteLine(restored.Name); // María Ivanova } }}Importante: XmlSerializer requiere que la clase tenga un constructor público sin parámetros, y que las propiedades serializables sean públicas y tengan setters.
3. BinaryFormatter (obsoleto, pero se menciona para legacy)
Anteriormente, System.Runtime.Serialization.Formatters.Binary.Bi