Ejecuta cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →
Serialización avanzada en Python
La serialización permite convertir objetos en formatos que puedan almacenarse o transmitirse. En esta guía aprenderás técnicas avanzadas con JSON, pickle, marshal, dataclasses + asdict, serialización personalizada, y buenas prácticas para sistemas distribuidos y APIs.
Tabla de contenidos
- Serialización con JSON
- Serialización con pickle
- marshal
- Serialización de dataclasses
- Serialización personalizada
- Buenas prácticas
- Ejercicios
- Mini‑proyecto
1. Serialización con JSON
import json
data = {"nombre": "Ana", "edad": 30}
texto = json.dumps(data)
print(texto)
obj = json.loads(texto)
print(obj)
2. Serialización con pickle
import pickle
class Usuario:
def __init__(self, nombre):
self.nombre = nombre
u = Usuario("Ana")
binario = pickle.dumps(u)
print(binario)
obj = pickle.loads(binario)
print(obj.nombre)
3. marshal
marshal es rápido pero solo sirve para tipos internos de Python.
import marshal
data = [1, 2, 3]
binario = marshal.dumps(data)
print(binario)
print(marshal.loads(binario))
4. Serialización de dataclasses
from dataclasses import dataclass, asdict
import json
@dataclass
class Usuario:
nombre: str
edad: int
u = Usuario("Ana", 30)
print(json.dumps(asdict(u)))
5. Serialización personalizada
import json
class Usuario:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def encode_usuario(obj):
if isinstance(obj, Usuario):
return {"__usuario__": True, "nombre": obj.nombre, "edad": obj.edad}
raise TypeError("No serializable")
def decode_usuario(d):
if "__usuario__" in d:
return Usuario(d["nombre"], d["edad"])
return d
u = Usuario("Ana", 30)
texto = json.dumps(u, default=encode_usuario)
print(texto)
obj = json.loads(texto, object_hook=decode_usuario)
print(obj.nombre)
6. Buenas prácticas
- Evita pickle en sistemas distribuidos (riesgo de ejecución arbitraria).
- Usa JSON para APIs y comunicación entre servicios.
- Usa dataclasses + asdict para estructuras limpias.
- Implementa object_hook para objetos complejos.
- Documenta el formato de salida.
7. Ejercicios
- Serializa una lista de objetos personalizados.
- Crea un object_hook para decodificar clases.
- Convierte dataclasses a JSON y viceversa.
- Implementa un formato binario propio.
- Haz un validador de JSON antes de cargarlo.
# object_hook
def hook(d):
if "tipo" in d: ...
return d
# validar JSON
import json
try: json.loads(texto)
except: print("JSON inválido")
8. Mini‑proyecto: Serializador universal
import json
from dataclasses import dataclass, asdict
class UniversalEncoder(json.JSONEncoder):
def default(self, obj):
if hasattr(obj, "__dict__"):
return obj.__dict__
return super().default(obj)
@dataclass
class Producto:
nombre: str
precio: float
p = Producto("Pan", 1.2)
print(json.dumps(p, cls=UniversalEncoder))