ProgramaciónDesarrollador Fullstack

¿Qué son la serialización y la deserialización de objetos en Python? ¿Qué módulos se utilizan para ello, cuándo aplicar pickle y cuándo json, y cuáles son sus diferencias fundamentales?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • pickle serializa (casi) cualquier objeto de Python, pero es peligroso y no universal.
  • json serializa solo tipos básicos, pero es seguro y multiplataforma.
  • Siempre piense en la seguridad y el ámbito de aplicación.

Preguntas trampa.

¿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.

Errores típicos y anti-patrones

  • La serialización con pickle de datos del usuario de fuentes no confiables es una vulnerabilidad crítica.
  • Intentar serializar tipos no estándar (por ejemplo, datetime) a través de json sin ajustes — se obtiene un error.
  • Almacenar archivos pickle en el servidor sin control de seguridad.

Ejemplo de la vida real

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.