[Métodos] Serializar y Deserializar objetos con Java
La serialización y deserialización son dos procesos utilizados en programación para convertir datos como texto o incluso un objeto de una clase, a un formato de código binario para almacenarlo o transmitirlo, y luego revertir ese proceso en otro momento o lugar para recuperar los datos originales.
Tomemos como ejemplo la sigueinte clase Persona
public class Persona implements Serializable { private static final long serialVersionUID = 1L; // Identificador de versión para la serialización private String nombre; private int edad; private String ciudad; // CONSTRUCTORES // GETTERS y SETTERS }
Es una simple clase en java que implementa la interfaz
Serializable
, de la cual cobra sentido el atributo serialVersionUID
ya este número de versión nos indicará a la hora de deserializar si la clase ha sufrido algún cambio o modificación.El siguiente ejemplo, muestra un método
main
que:- Instancia un objeto de la clase
Persona
- Serializa el objeto y lo guarda en un archivo, misma ubicación donde se está ejecutando, bajo el nombre de "persona.ser"
- Por último, este fragmento de Deserialización pudiera estar en otro lado, pero hace lo propio deserializando un archivo "persona.ser", en la misma ubicación que la ejecución y lo lleva a un objeto
Persona
public static void main(String[] args) { // Crear una instancia de Persona Persona persona = new Persona("Darío", 35, "Buenos Aires"); // Serialización try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("persona.ser"))) { oos.writeObject(persona); System.out.println("Persona serializada correctamente."); } catch (IOException e) { e.printStackTrace(); } // Deserialización try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("persona.ser"))) { Persona personaDeserializada = (Persona) ois.readObject(); System.out.println("Persona deserializada: " + personaDeserializada); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }
Por último, nuestra propia implementación para reutilizar en métodos independientes:
Serializar
public static void serializarObjeto(Object objeto, String ubicacion, String nombreArchivo) { try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(ubicacion + File.separator + nombreArchivo))) { oos.writeObject(objeto); System.out.println("Objeto serializado correctamente en: " + ubicacion + File.separator + nombreArchivo); } catch (IOException e) { e.printStackTrace(); } }
Deserializar
// Método para deserializar un objeto desde un archivo public static Object deserializarObjeto(String ubicacion, String nombreArchivo, String nombreClase) { Object objetoDeserializado = null; try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(ubicacion + File.separator + nombreArchivo))) { objetoDeserializado = ois.readObject(); System.out.println("Objeto deserializado correctamente desde: " + ubicacion + File.separator + nombreArchivo); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } return objetoDeserializado; }
Uso
public static void main(String[] args) { // Ejemplo de serialización y deserialización Persona persona = new Persona("Dario", 35, "Buenos Aires"); // Serialización serializarObjeto(persona, "ruta/del/directorio", "persona.ser"); // Deserialización Persona personaDeserializada = (Persona) deserializarObjeto("ruta/del/directorio", "persona.ser", Persona.class.getName()); System.out.println("Persona deserializada: " + personaDeserializada); }