Python tiene varias maneras para serializar / deserializar datos. En este tutorial vamos a ver el módulo marshal y el módulo cpickle. Antes de ver cómo serializar en Python, vamos a dar brevemente una explicación de este concepto. La serialización es un proceso muy usado para guardar objetos en un archivo o base de datos o para enviarlos a través de la red.
Es hora de empezar con el tuorial, veremos un ejemplo con cada módulo.
1. Módulo marshal
Antes de empezar debes saber que este módulo no asegura compatibilidad entre distintas versiones del compilador Python.
Vamos a ver el primer ejemplo, muy sencillo:
import marshal data = [1, 2 ,3 ,4] objectBytes = marshal.dumps(data) print("Serializado:",objectBytes) objectLoad = marshal.loads(objectBytes) print("Deserializado:",objectLoad)Como primer paso importamos la librería marshal, hemos creado una lista que vamos a serializar, luego la pintamos y la deserializamos. La función dumps se encarga de serializar y la función loads de deserializar (ambas reciben el objeto con el que trabar). Muy fácil como habéis visto. A continuación dejo una captura de su ejecución:
Y aquí concluimos con el primer ejemplo.
En este ejemplo vamos a escribir un objeto en un archivo.
import marshal data = [1, 2 ,3 ,4] fileOut = open("file.dat", "bw") marshal.dump(data, fileOut) fileOut.close() fileIn = open("file.dat", "br") dataLoad = marshal.load(fileIn) print("Deserializado:",dataLoad) fileIn.close()La importación y la lista se mantienen, solo que ahora vamos a usar archivos, abrimos un fichero para escritura, la b es para bytes, y volcamos la lista (ahora la función es dump y recibe los datos a escribir y el fichero), cuando terminamos lo cerramos. Para terminar abrimos el mismo fichero en modo lectura y leemos de él (fíjate que la función es load, y que recibe como parámetro el fichero), para terminar cerramos el fichero.
Si miramos el archivo file.dat, veremos lo siguiente:
Trabajar en red no es mucho más difícil, solo recuerda la pequeña limitación de la compatibilidad entre las versiones de Python. Vamos a pasar al otro módulo.
2. Módulo cpickle
Este módulo está escrito en C, existe otro llamado pickle que está desarrollado en Python, pero es más lento, por lo que es aconsejable usar cpickle. A diferencia de marshal este módulo si va a garantizar la compatibilidad entre versiones de Python, así que antes de programar tenemos que tener en cuenta estas cosas.
Para este módulo vamos a ver un ejemplo, en el que utilizamos sockets, vamos a ver el código del servidor, solo se trata de ver como realizaríamos la serialización o deserialización, por eso no se incluye tratamiento de errores y se utiliza un solo mensaje.
import socket import pickle s = socket.socket() s.bind(("localhost", 2016)) s.listen(1) conn, addr = s.accept() data = conn.recv(1024) print("Datos recibidos:",data) print("Deserializados:",pickle.loads(data)) s.close()Vemos que funciona todo como con sockets normales, solo que los datos recibidos nos llegaran serializadas, por lo que los deserializamos con la función loads, como puedes ver se llama igual que en el módulo marshal. Por último vamos a ver el cliente:
import socket import pickle s = socket.socket() data = [1, 2 ,3 ,4] objectBytes = pickle.dumps(data) s.connect(("localhost", 2016)) s.send(objectBytes) s.close()No tiene mayor complicación, serializamos el objeto con dumps y se lo enviamos al socket creado. A continuación dejo la salida del servidor cuando se conecta un cliente, la salida del cliente se omite, ya que no muestra nada.
Hasta aquí llega el tutorial sobre serializar y deserializar datos en Python, como sabemos este lenguaje nos facilita muchos las cosas.