La serialización es el proceso de convertir un objeto en un flujo de bytes (o una cadena) para guardarlo o enviarlo por la red, mientras que la deserialización es la operación inversa.
Históricamente, en Python, el principal problema ha sido la estandarización del intercambio de estructuras de datos complejas entre diversas aplicaciones y lenguajes. Para ello, en la biblioteca estándar aparecieron varios módulos: primero pickle para la serialización de cualquier objeto de Python, y más tarde json para el intercambio universal con sistemas externos.
Problema: pickle almacena datos específicos de Python, no es seguro (puede ejecutar código arbitrario al cargarse) y no es compatible con otros lenguajes, json — se limita a tipos simples (dict, list, str, int, float, bool y None), pero es más seguro y se usa ampliamente para el intercambio entre diferentes tecnologías.
Solución: usar pickle solo para datos de confianza entre sistemas Python; aplicar json para el intercambio con servicios externos, desarrollo web y transmisión de estructuras de datos legibles por humanos.
Ejemplo de código:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # Serialización con pickle pickled = pickle.dumps(data) # bytes unpickled = pickle.loads(pickled) print(unpickled) # Serialización con json jsoned = json.dumps(data) # string unjsoned = json.loads(jsoned) print(unjsoned)
Características clave:
¿Se pueden enviar respuestas HTTP API a sistemas externos utilizando pickle?
¡No! pickle no es un estándar de intercambio de datos entre lenguajes y es extremadamente inseguro: cargar desde pickle puede ejecutar código extraño. json es mucho mejor para la interacción externa.
¿Se pueden serializar funciones, clases o funciones lambda en json?
No. json solo trabaja con tipos primitivos; ni el json estándar ni la mayoría de los analizadores serializan funciones y clases.
¿Puede pickle serializar objetos con enlaces cíclicos?
Sí, pickle maneja automáticamente la mayoría de los enlaces cíclicos, incluso en estructuras recursivas. Para json, esto suele ser un error fatal.
Caso negativo: Transmitir objetos pickle a aplicaciones cliente para intercambiar datos.
Ventajas: implementación simple, se mantienen todos los tipos de Python.
Desventajas: extremadamente peligroso, imposible de interactuar con otros lenguajes.
Caso positivo: Enviar datos a través de json, transformando tipos no estándar con codificadores.
Ventajas: seguridad, compatibilidad, flexibilidad.
Desventajas: limitación en los tipos compatibles, a veces requiere un codificador/decodificador personalizado.