Cargando



Como serializar y deserializar datos en Python

En este tutorial se hace uso de los módulos marshal y cpickle para mostrar la serialización y deserialización de objetos en Python.


ago 02 2016 14:03
Avanzado
ago 03 2016 09:04

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.

 

Ejemplo 1

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:

 

serializar_python_1.jpg

 

Y aquí concluimos con el primer ejemplo.

 

Ejemplo 2

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:

 

file.jpg

 

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.

 

Nota
En Python 3 cPickle fue renombrado a _pickle y se usa de forma automática por el módulo pickle.

 

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.

 

serializar_python_2.jpg

 

Hasta aquí llega el tutorial sobre serializar y deserializar datos en Python, como sabemos este lenguaje nos facilita muchos las cosas.

 

Nota
En el tutorial se hace uso de la versión de Python 3.5.


¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X