40. Serialización II

Vídeo

Notas personales

En esta lección, continuaremos estudiando el tema de la serialización, analizando ahora cómo llevar a cabo el proceso cuando hay objetos implicados.

Aprovechemos la clase Vehiculo que generamos anteriormente y cuyo código fuente recordemos era:

class Vehiculo():
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo
        self.enmarcha = False
        self.acelera = False
        self.frena = False

    def arrancar(self):
        self.enmarcha = True

    def acelerar(self):
        self.acelera = True

    def frenar(self):
        self.frena = True

    def estado(self):
        print("Marca:", self.marca, "\nModelo:", self.modelo, "\nEn marcha:",
              self.enmarcha, "\nAcelerando:", self.acelera, "\nFrenando:",
              self.frena)

A continuación, importemos la librería pickle y creemos una lista con algunas instancias de la clase Vehiculo:

import pickle

coche1 = Vehiculo("Mazda", "MX5")
coche2 = Vehiculo("Seat", "León")
coche3 = Vehiculo("Renault", "Megane")

coches = [coche1, coche2, coche3]

fichero = open("coches", "wb")

pickle.dump(coches, fichero)

fichero.close()

del fichero

Notas:

  • Recordemos que estamos creando ficheros externos cuya codificación es binaria, es por ello que el valor del parámetro correspondiente de la función open() es "wb".
  • Al ejecutar el anterior bloque de código, aparecerá en la carpeta asociada del repositorio) el fichero coches.

Para rescatar la información de este archivo que acabamos de generar, tecleamos:

import pickle


class Vehiculo():
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo
        self.enmarcha = False
        self.acelera = False
        self.frena = False

    def arrancar(self):
        self.enmarcha = True

    def acelerar(self):
        self.acelera = True

    def frenar(self):
        self.frena = True

    def estado(self):
        print("Marca:", self.marca, "\nModelo:", self.modelo, "\nEn marcha:",
              self.enmarcha, "\nAcelerando:", self.acelera, "\nFrenando:",
              self.frena)


fichero = open("coches", "rb")

coches = pickle.load(fichero)

print(coches)
[<__main__.Vehiculo object at 0x00000259428D65C0>, <__main__.Vehiculo object at 0x00000259428F7F28>, <__main__.Vehiculo object at 0x00000259428F7F98>]

Efectivamente, disponemos ahora de una lista con tres objetos. No obstante, recordemos que tenemos el método estado para acceder a información de interés sobre dichos objetos. Así, si escribimos:

for coche in coches:
    print(coche.estado())
Marca: Mazda 
Modelo: MX5 
En marcha: False 
Acelerando: False 
Frenando: False
None
Marca: Seat 
Modelo: León 
En marcha: False 
Acelerando: False 
Frenando: False
None
Marca: Renault 
Modelo: Megane 
En marcha: False 
Acelerando: False 
Frenando: False
None

Nota: como podemos comprobar arriba, si hacemos la recuperación de la serialización en un fichero distinto, la definición de la clase Vehiculo es necesario que figure asimismo (en caso contrario arroja Python un error). El problema radica en que el nuevo archivo no tiene información sobre la clase Vehiculo ni, por supuesto, del método estado().

Código fuente

El código fuente y los posibles ficheros externos generados correspondientes a esta lección se encuentran disponibles para su consulta en la carpeta /lecciones/40/ del repositorio.

Anterior
Siguiente