Resumen

Convertir objetos de memoria en archivos persistentes y recuperarlos sin perder información es una habilidad fundamental en cualquier aplicación moderna. En .NET, System.Text.Json ofrece una solución nativa, rápida y completa para trabajar con el formato JSON, el estándar de la industria para APIs, almacenamiento de datos y comunicación entre sistemas.

¿Qué significa serializar y deserializar datos en .NET?

Serializar es convertir un objeto que está vivo en la memoria del programa a un texto que puede almacenarse en disco [0:06]. Deserializar es el proceso opuesto: tomar ese texto y reconstruir el objeto original en memoria. Estos dos conceptos son la base de toda persistencia de datos en aplicaciones .NET.

Para este propósito se utiliza el namespace System.Text.Json, que viene integrado en .NET, lo que elimina la necesidad de dependencias externas y garantiza un alto rendimiento.

¿Cómo se estructura la clase JsonInventarioStorage?

Dentro de la carpeta de infraestructura del proyecto, se crea el archivo JsonInventarioStorage [0:25]. Esta clase tiene una única responsabilidad: guardar y cargar el inventario, delegando las operaciones de archivos al FileManager.

La clase utiliza dos campos privados de solo lectura (read only) [0:43]:

  • _fileManager: almacena la instancia del gestor de archivos para leer y escribir JSON.
  • _options: almacena la configuración de serialización mediante JsonSerializerOptions.

El constructor de la clase instancia ambos campos. Recuerda que un constructor no retorna valor y debe llevar el mismo nombre que la clase [1:29].

¿Cómo se configuran las opciones de serialización?

Al crear una nueva instancia de JsonSerializerOptions, se definen tres configuraciones clave [1:46]:

  • WriteIndented = true: formatea el JSON con indentación y saltos de línea para hacerlo legible en consola y en disco.
  • PropertyNamingPolicy = JsonNamingPolicy.CamelCase: ignora diferencias de mayúsculas y minúsculas en los nombres de las propiedades.
  • Converters con JsonStringEnumConverter: convierte los enums a strings en el JSON. Sin esta opción, un valor como Estado.Activo se serializaría como número; con ella, aparece como "Activo" [2:18].

Para que JsonNamingPolicy funcione correctamente, es necesario importar System.Text.Json.Serialization [2:09].

¿Cómo funcionan los métodos guardar, cargar y crear backup?

El método Guardar serializa una lista de productos a JSON y lo almacena como archivo, por ejemplo datos.json [2:39]. Recibe la lista en memoria y la ruta destino.

El método Cargar lee el archivo JSON y lo deserializa de vuelta a una lista de tipo Producto [2:55]. Retorna los datos listos para ser utilizados en la aplicación.

El método CrearBackup genera una copia de seguridad del archivo JSON [3:07]. Su flujo es:

  • Verifica si el archivo original existe; si no, retorna null.
  • Obtiene el directorio, el nombre sin extensión y la extensión del archivo.
  • Genera un timestamp con DateTime.Now en formato año-mes-día-hora-minuto-segundo [3:35].
  • Construye la ruta del backup usando Path.Combine con interpolación de strings que incluye el nombre original, la palabra "backup", el timestamp y la extensión [3:48].
  • Ejecuta File.Copy para copiar el archivo original a la nueva ubicación [4:22].

¿Cómo se prueba la integración JSON desde Program.cs?

Para validar el funcionamiento, en Program.cs se crea una instancia de JsonInventarioStorage llamada almacenamiento [4:44]. Después se define una lista de productos con datos manuales:

  • Producto 1: ID 1, nombre "Laptop", precio decimal con sufijo M, categoría CategoriaProducto.Electronica, estado disponible [5:03].
  • Producto 2: ID 2, nombre "Camiseta", precio 19.99M, cantidad 50, categoría CategoriaProducto.Ropa, estado activo [5:27].

Se define la ruta como inventario_test.json, se llama a almacenamiento.CrearBackup() y luego a almacenamiento.Guardar() con los productos y la ruta [5:48]. Al ejecutar con dotnet run, el programa guarda, deserializa y muestra las propiedades: ID, nombre, precio, cantidad, categoría, estado, fecha de registro y valor total [6:20].

¿Qué ocurre si el modelo cambia después de crear el JSON?

Si mañana se agrega una propiedad como Color a la clase C# pero se intenta cargar un JSON antiguo que no la tiene, el programa no falla [6:42]. El serializador asigna el valor por defecto a esa nueva propiedad y continúa funcionando. Esta característica es invaluable para mantener la flexibilidad del software a lo largo del tiempo.

Con esta implementación se logra un sistema robusto de persistencia con opciones configurables y respaldos automáticos. El siguiente paso natural es conectar el repositorio y el storage JSON mediante un orquestador: el InventarioService, que definirá cómo el usuario interactúa con ambas piezas de forma ordenada. ¿Ya tienes ideas sobre cómo organizarías esa interacción?