Serialización (Pickle, JSON)

 La serialización consiste en convertir objetos de Python en un formato que pueda:

  • guardarse en un archivo

  • enviarse por red

  • reconstruirse más tarde

Python ofrece dos métodos principales:

  • Pickle → guarda objetos de Python tal cual

  • JSON → formato estándar, compatible con otros lenguajes

1. Serialización con Pickle

Pickle permite guardar cualquier objeto de Python: listas, diccionarios, clases, etc.

Guardar un objeto

import pickle

datos = {"nombre": "Ana", "edad": 22}

with open("datos.pkl", "wb") as f:
    pickle.dump(datos, f)

Cargar un objeto

with open("datos.pkl", "rb") as f:
    datos_cargados = pickle.load(f)

print(datos_cargados)

Ventajas de Pickle

  • Guarda objetos complejos

  • Muy fácil de usar

Desventajas

  • No es legible por humanos

  • No es seguro cargar datos de fuentes desconocidas

  • No es compatible con otros lenguajes

2. Serialización con JSON

JSON es un formato universal, legible y compatible con cualquier lenguaje.

Guardar datos en JSON

import json

usuario = {
    "nombre": "Luis",
    "edad": 30,
    "activo": True,
    "cursos": ["Python", "Redes"]
}

with open("usuario.json", "w", encoding="utf-8") as f:
    json.dump(usuario, f, indent=4, ensure_ascii=False)

Cargar datos desde JSON

with open("usuario.json", "r", encoding="utf-8") as f:
    datos = json.load(f)

print(datos)

Ventajas de JSON

  • Legible

  • Compatible con cualquier lenguaje

  • Ideal para APIs, configuraciones, datos estructurados

Desventajas

  • No soporta objetos complejos directamente

  • Solo tipos básicos: dict, list, str, int, float, bool, None

3. Convertir objetos personalizados a JSON

Para serializar clases, hay que convertirlas a diccionarios.

class Alumno:
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad

a = Alumno("Ana", 20)

# Convertir a dict
datos = a.__dict__

json.dump(datos, open("alumno.json", "w"))

ACTIVIDAD PRÁCTICA: “Gestor de usuarios con guardado y carga”

Objetivo: que tus alumnos aprendan a guardar y cargar datos de forma persistente usando JSON y Pickle.

Enunciado

Crea un programa que gestione usuarios con:

  • nombre

  • email

  • edad

El programa debe permitir:

  1. Añadir usuarios

  2. Mostrar usuarios

  3. Guardarlos en un archivo JSON

  4. Guardarlos en un archivo Pickle

  5. Cargar usuarios desde JSON

  6. Cargar usuarios desde Pickle

Pistas

  • Usa una lista de diccionarios

  • Crea funciones: guardar_json(), cargar_json(), etc.

  • Usa un menú con bucles

Solución propuesta

import json
import pickle

usuarios = []

def añadir_usuario():
    nombre = input("Nombre: ")
    email = input("Email: ")
    edad = int(input("Edad: "))
    usuarios.append({"nombre": nombre, "email": email, "edad": edad})

def mostrar_usuarios():
    for u in usuarios:
        print(f"{u['nombre']} - {u['email']} - {u['edad']} años")

def guardar_json():
    with open("usuarios.json", "w", encoding="utf-8") as f:
        json.dump(usuarios, f, indent=4, ensure_ascii=False)
    print("Usuarios guardados en JSON.")

def cargar_json():
    global usuarios
    with open("usuarios.json", "r", encoding="utf-8") as f:
        usuarios = json.load(f)
    print("Usuarios cargados desde JSON.")

def guardar_pickle():
    with open("usuarios.pkl", "wb") as f:
        pickle.dump(usuarios, f)
    print("Usuarios guardados en Pickle.")

def cargar_pickle():
    global usuarios
    with open("usuarios.pkl", "rb") as f:
        usuarios = pickle.load(f)
    print("Usuarios cargados desde Pickle.")


# --- Menú ---
while True:
    print("\n--- GESTOR DE USUARIOS ---")
    print("1. Añadir usuario")
    print("2. Mostrar usuarios")
    print("3. Guardar en JSON")
    print("4. Cargar desde JSON")
    print("5. Guardar en Pickle")
    print("6. Cargar desde Pickle")
    print("7. Salir")

    opcion = input("Elige opción: ")

    if opcion == "1":
        añadir_usuario()
    elif opcion == "2":
        mostrar_usuarios()
    elif opcion == "3":
        guardar_json()
    elif opcion == "4":
        cargar_json()
    elif opcion == "5":
        guardar_pickle()
    elif opcion == "6":
        cargar_pickle()
    elif opcion == "7":
        break
    else:
        print("Opción no válida.")

Ejemplo de salida

--- GESTOR DE USUARIOS ---
1. Añadir usuario
2. Mostrar usuarios
3. Guardar en JSON
4. Cargar desde JSON
5. Guardar en Pickle
6. Cargar desde Pickle
7. Salir
Elige opción: 1
Nombre: Ana
Email: ana@mail.com
Edad: 22