La serialización es el proceso de convertir un objeto en una secuencia de bytes
para almacenarlo o transmitirlo a la memoria, a una base de datos o a un archivo.
Su propósito principal es guardar el estado de un objeto para poder volver a
crearlo cuando sea necesario. El proceso inverso se denomina deserialización.
Por ejemplo, guardar una lista de Python en un archivo de texto o
base de datos, y luego cargarlo cuando sea necesario, para ser tratado con su tipo de datos.
Formatos comunes entre los distintos lenguajes de programación incluyen XML y JSON.
Python ofrece tres módulos diferentes en la biblioteca estándar que le permiten
serializar y deserializar objetos:
Propósito: es una libraría para implementa protocolos binarios para serializar
y deserializar una estructura de objetos Python, es decir, convertirlos en un flujo
de bytes que se puede almacenar o transmitir por una red.
El módulo pickle implementa protocolos binarios para serializar y deserializar
una estructura de objetos Python.
El módulo pickle nos permite serializar y deserializar datos en archivos binarios.
Podemos usarlo para guardar y cargar registros como si fuera una base de datos simple.
En lugar de una base de datos real, usaremos un archivo .pkl para almacenar los
datos en una lista de diccionarios.
📌 Ventajas de pickle:
✅ Fácil de usar, sin necesidad de instalar bases de datos.
✅ Útil para almacenar estructuras de datos complejas (listas, diccionarios, objetos).
A continuación se presenta una práctica más real de implementar el uso de proyectos
con pickle para operaciones CRUD en un archivo de registros serializados:
"""Programa que simula un inventario de productos"""importosimportsysfrompathlibimportPathimportpickleclassProducto:"""Clase Producto"""def__init__(self,id,descripcion):"""Método constructor de clase de Producto Args: id (int): ID del producto descripcion (str): Descripción del producto """self.id=idself.descripcion=descripciondef__str__(self):"""Método de representación de informal del objeto, usado para crear la salida que se le mostrará al usuario"""returnf"Id: {self.id}\nDescripción: {self.descripcion}"def__repr__(self):"""Método de representación de formal del objeto, usado para depuración y desarrollo"""returnf"{self.__class__.__name__}:({repr(self.id)}, {repr(self.descripcion)})"classInventario:"""Clase Inventario"""def__init__(self):"""Método constructor de clase de Inventario"""self._DB_DIR=(os.path.dirname(os.path.abspath(__file__))+os.sep+"filestorage/")self.productos=[]self.archivo=self._DB_DIR+"inventario.pkl"self.leer_datos()def__str__(self):"""Método de representación de informal del objeto, usado para crear la salida que se le mostrará al usuario"""returnf"Ruta BD: {self.archivo}"def__repr__(self):"""Método de representación de formal del objeto, usado para depuración y desarrollo"""returnf"{self.__class__.__name__}:({repr(self.archivo)})"defleer_datos(self):"""Leer el archivo de almacenamiento"""try:Path(self._DB_DIR).mkdir(parents=True,exist_ok=True)withopen(self.archivo,"rb")asbd:self.productos=pickle.load(bd)exceptFileNotFoundError:print("El archivo no existe en la ubicación")defguardar_datos(self):"""Guarda los datos"""try:ifos.path.isfile(self.archivo):os.remove(self.archivo)withopen(self.archivo,"wb")asbd:pickle.dump(self.productos,bd)exceptOSError:print("El archivo no existe en la ubicación")defexiste(self,codigo):"""Valida si existe el producto Args: codigo (int): ID del producto """ifself.productos:forproductoinself.productos:ifproducto.id==codigo:returnTruereturnFalsedefbuscar(self,codigo):"""Buscar el producto en el Inventario Args: codigo (int): ID del producto """forposicion,productoinenumerate(self.productos):ifproducto.id==codigo:returnposicion,productoreturn0,Nonedefagregar_registro(self,codigo):"""Agregar el producto Args: codigo (int): ID del producto """descripcion=input("Descripción: ")producto=Producto(codigo,descripcion)self.productos.append(producto)self.guardar_datos()defmostrar_registro(self,codigo):"""Mostrar el producto Args: codigo (int): ID del producto """ifself.existe(codigo):posicion,producto=self.buscar(codigo)print(producto)else:print("¡El producto no existe!")input("Presione ENTER para continuar")defactualizar_registro(self,codigo):"""Actualizar el producto Args: codigo (int): ID del producto """ifself.existe(codigo):posicion,producto=self.buscar(codigo)print(producto)print("Escribe nuevos datos: ")descripcion=input("Descripción: ")self.productos[posicion].descripcion=descripcionself.guardar_datos()print("¡Actualizado exitosamente!")else:print("¡El producto no existe!")input("Presione ENTER para continuar")defeliminar_registro(self,codigo):"""Eliminar el producto Args: codigo (int): ID del producto """ifself.existe(codigo):posicion,producto=self.buscar(codigo)print(producto)confirmar=input("¿Estas seguro? (S/N): ").upper()ifconfirmarin("s","S","si","Si","SI"):delself.productos[posicion]self.guardar_datos()print("¡Eliminado exitosamente!")else:print("¡El producto no existe!")input("Presione ENTER para continuar")defmenu_principal(self):"""Menu principal del programa"""try:# Instancia de la clase Inventarioinventario=Inventario()whileTrue:print("\n==============")print("MENÚ PRINCIPAL")print("==============\n")opciones_menu="1) Crear\n"opciones_menu+="2) Consultar\n"opciones_menu+="3) Actualizar\n"opciones_menu+="4) Eliminar\n"opciones_menu+="5) Salir\n"opciones_menu+="\nElija uno: "# Solicitar al usuario que elija una opciónopcion=int(input(opciones_menu))# Opciones del menúifopcion==1:codigo=int(input("Id de Producto: "))ifnotinventario.existe(codigo):inventario.agregar_registro(codigo)print("¡Registro exitoso!")else:print("¡Producto ya existe!")input("Presione ENTER para continuar")elifopcion==2:codigo=int(input("Id de Producto: "))inventario.mostrar_registro(codigo)elifopcion==3:codigo=int(input("Id de Producto: "))inventario.actualizar_registro(codigo)elifopcion==4:codigo=int(input("Id de Producto: "))inventario.eliminar_registro(codigo)elifopcion==5:breakexceptKeyboardInterrupt:print(" <Ctrl-C> introducido, saliendo del programa...\n")sys.exit()if__name__=="__main__":# Instancia de la clase Inventarioapp=Inventario()# Llamar al método menu_principalapp.menu_principal()
Importante
Usted puede descargar el código usado en esta sección haciendo clic en el
siguiente enlace: