Serialización de objetos en C# (.NET): desde lo básico hasta técnicas avanzadas
La serialización es el proceso de convertir objetos complejos (clases, estructuras) en un formato que se pueda guardar en un archivo, transmitir por la red o escribir en una base de datos. El proceso inverso (restaurar un objeto desde un flujo de datos) se llama deserialización. En la plataforma .NET existen varias herramientas integradas y de terceros para la serialización, cada una con sus propias características, rendimiento y ámbito de aplicación.
En este artículo analizaremos las principales formas de serialización en C#: JSON (System.Text.Json y Newtonsoft.Json), XML (XmlSerializer), serialización binaria (BinaryFormatter — obsoleto, pero aún se encuentra) y Protocol Buffers (protobuf-net) para escenarios de alto rendimiento.
1. Serialización en JSON con System.Text.Json
A partir de .NET Core 3.0, Microsoft recomienda usar el espacio de nombres System.Text.Json para trabajar con JSON. Es una API rápida, de bajo nivel y asíncrona.
Ejemplo 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 string Email { get; set; }}
class Program{ static void Main() { var person = new Person { Name = "Iván Petrov", Age = 30, Email = "ivan@example.com" };
// Serialización a cadena JSON string jsonString = JsonSerializer.Serialize(person); Console.WriteLine(jsonString); // Salida: {"Name":"Iván Petrov","Age":30,"Email":"ivan@example.com"}
// Deserialización desde JSON string jsonInput = @"{""Name"":""María"",""Age"":25,""Email"":""maria@test.ru""}"; Person restoredPerson = JsonSerializer.Deserialize<Person>(jsonInput); Console.WriteLine($"Nombre: {restoredPerson.Name}, Edad: {restoredPerson.Age}"); }}Configuración de la serialización:
- Ignorar propiedades null:
JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull } - Formateo (pretty print):
JsonSerializerOptions { WriteIndented = true } - Trabajar con referencias cíclicas:
ReferenceHandler.Preserve
2. Newtonsoft.Json (Json.NET) — el clásico
Antes de la llegada de System.Text.Json, el estándar de facto era la biblioteca Newtonsoft.Json (se instala a través de NuGet). Soporta más escenarios: objetos dinámicos, atributos, convertidores y configuraciones flexibles.
using Newtonsoft.Json;
public class Order{ public int Id { get; set; } public decimal Amount { get; set; } [JsonIgnore] public string InternalNote { get; set; } // Este campo no se serializará}
var order = new Order { Id = 1, Amount = 99.99m, InternalNote = "Secreto" };string json = JsonConvert.SerializeObject(order, Formatting.Indented);Console.WriteLine(json);// {// "Id": 1,// "Amount": 99.99// }
var deserialized = JsonConvert.DeserializeObject<Order>(json);3. Serialización en XML (XmlSerializer)
Para el formato XML en .NET se utiliza la clase XmlSerializer. Es adecuada para la compatibilidad con sistemas heredados y servicios SOAP.
using System;using System.IO;using System.Xml.Serialization;
[Serializable]public class Product{ [XmlAttribute] public int Id { get; set; } [XmlElement("ProductName")] public string Name { get; set; }}
class Program{ static void Main() { var product = new Product { Id = 42, Name = "Portátil" };
// Serializaci