La serialización en Java es el proceso de convertir un objeto en una secuencia de bytes para que pueda ser almacenado en un archivo, transmitido a través de una red o guardado en una base de datos. La deserialización es el proceso inverso, donde la secuencia de bytes se convierte de nuevo en un objeto.
Conceptos Clave
- Serializable Interface: Una interfaz que debe ser implementada por una clase para que sus objetos puedan ser serializados.
- ObjectOutputStream: Una clase que se utiliza para escribir objetos a un flujo de salida.
- ObjectInputStream: Una clase que se utiliza para leer objetos de un flujo de entrada.
- transient Keyword: Una palabra clave que se utiliza para indicar que un campo no debe ser serializado.
Ejemplo Práctico
Paso 1: Crear una Clase Serializable
import java.io.Serializable;
public class Persona implements Serializable {
private static final long serialVersionUID = 1L;
private String nombre;
private int edad;
private transient String password; // Este campo no será serializado
public Persona(String nombre, int edad, String password) {
this.nombre = nombre;
this.edad = edad;
this.password = password;
}
@Override
public String toString() {
return "Persona [nombre=" + nombre + ", edad=" + edad + ", password=" + password + "]";
}
}Paso 2: Serializar el Objeto
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializarDemo {
public static void main(String[] args) {
Persona persona = new Persona("Juan", 30, "miPassword");
try (FileOutputStream fileOut = new FileOutputStream("persona.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(persona);
System.out.println("Objeto serializado y guardado en persona.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}Paso 3: Deserializar el Objeto
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializarDemo {
public static void main(String[] args) {
Persona persona = null;
try (FileInputStream fileIn = new FileInputStream("persona.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
persona = (Persona) in.readObject();
} catch (IOException i) {
i.printStackTrace();
} catch (ClassNotFoundException c) {
System.out.println("Clase Persona no encontrada");
c.printStackTrace();
}
System.out.println("Objeto deserializado:");
System.out.println(persona);
}
}Explicación del Código
- Clase Persona: Implementa la interfaz
Serializable, lo que permite que sus instancias sean serializadas. El campopasswordestá marcado comotransient, por lo que no será serializado. - SerializarDemo: Crea una instancia de
Personay la serializa utilizandoObjectOutputStream. - DeserializarDemo: Lee el objeto serializado desde el archivo y lo deserializa utilizando
ObjectInputStream.
Ejercicio Práctico
Ejercicio 1: Serializar y Deserializar un Objeto
- Crea una clase
Libroque implementeSerializablecon los siguientes campos:titulo,autor,precio. - Serializa una instancia de
Libroy guárdala en un archivo. - Deserializa el objeto desde el archivo y muestra sus atributos en la consola.
Solución
import java.io.Serializable;
public class Libro implements Serializable {
private static final long serialVersionUID = 1L;
private String titulo;
private String autor;
private double precio;
public Libro(String titulo, String autor, double precio) {
this.titulo = titulo;
this.autor = autor;
this.precio = precio;
}
@Override
public String toString() {
return "Libro [titulo=" + titulo + ", autor=" + autor + ", precio=" + precio + "]";
}
}import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class SerializarLibro {
public static void main(String[] args) {
Libro libro = new Libro("El Quijote", "Miguel de Cervantes", 19.99);
try (FileOutputStream fileOut = new FileOutputStream("libro.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(libro);
System.out.println("Objeto Libro serializado y guardado en libro.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializarLibro {
public static void main(String[] args) {
Libro libro = null;
try (FileInputStream fileIn = new FileInputStream("libro.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
libro = (Libro) in.readObject();
} catch (IOException i) {
i.printStackTrace();
} catch (ClassNotFoundException c) {
System.out.println("Clase Libro no encontrada");
c.printStackTrace();
}
System.out.println("Objeto Libro deserializado:");
System.out.println(libro);
}
}Errores Comunes y Consejos
- No Implementar Serializable: Si una clase no implementa
Serializable, se lanzará unaNotSerializableException. - serialVersionUID: Es recomendable definir un
serialVersionUIDpara evitar problemas de compatibilidad durante la deserialización. - Campos Transient: Recuerda que los campos marcados como
transientno serán serializados. Asegúrate de que esto es lo que deseas.
Conclusión
La serialización es una herramienta poderosa en Java que permite la persistencia y transmisión de objetos. Al comprender cómo serializar y deserializar objetos, puedes almacenar el estado de tus aplicaciones y compartir datos de manera eficiente. En el siguiente módulo, exploraremos el manejo de excepciones, una parte crucial para crear aplicaciones robustas y seguras.
Curso de Programación en Java
Módulo 1: Introducción a Java
- Introducción a Java
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Operadores
Módulo 2: Flujo de Control
Módulo 3: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Métodos
- Constructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Programación Orientada a Objetos Avanzada
Módulo 5: Estructuras de Datos y Colecciones
Módulo 6: Manejo de Excepciones
- Introducción a las Excepciones
- Bloque Try-Catch
- Throw y Throws
- Excepciones Personalizadas
- Bloque Finally
Módulo 7: Entrada/Salida de Archivos
- Lectura de Archivos
- Escritura de Archivos
- Flujos de Archivos
- BufferedReader y BufferedWriter
- Serialización
Módulo 8: Multihilo y Concurrencia
- Introducción al Multihilo
- Creación de Hilos
- Ciclo de Vida de un Hilo
- Sincronización
- Utilidades de Concurrencia
Módulo 9: Redes
- Introducción a las Redes
- Sockets
- ServerSocket
- DatagramSocket y DatagramPacket
- URL y HttpURLConnection
