IOKELU
Nivel: Avanzado – Guía 15
💡 Prueba el código:
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

7. Ejercicios

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))

Siguiente guía

Logging profesional →