Serialización de objetos en Java: ¿qué es y para qué sirve?
La serialización en Java es el proceso de convertir el estado de un objeto en un flujo de bytes para guardarlo en un archivo, base de datos o transmitirlo a través de una red. El proceso inverso, la reconstrucción del objeto a partir del flujo de bytes, se llama deserialización. Esta tecnología es la base de muchos frameworks de Java: desde RMI (Remote Method Invocation) hasta sistemas de mensajería.
En este artículo, analizaremos cómo funciona la serialización integrada de Java con ejemplos prácticos y veremos las mejores prácticas para su uso.
¿Cómo funciona la serialización en Java?
Java proporciona un mecanismo de serialización integrado a través de la interfaz java.io.Serializable. Esta interfaz no contiene métodos; es una interfaz marcadora (marker interface). Si una clase implementa Serializable, la JVM permite automáticamente la serialización de sus objetos.
Para escribir y leer objetos se utilizan dos clases principales del paquete java.io:
ObjectOutputStream— serializa un objeto en un flujo de bytesObjectInputStream— deserializa un objeto desde un flujo de bytes
Ejemplo simple de serialización
Creemos una clase Person que se pueda serializar:
import java.io.Serializable;
public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private transient String password; // no será serializado
public Person(String name, int age, String password) { this.name = name; this.age = age; this.password = password; }
@Override public String toString() { return "Person{name='" + name + "', age=" + age + ", password='" + password + "'}"; }}Ahora escribamos el código para la serialización y deserialización:
import java.io.*;
public class SerializationDemo { public static void main(String[] args) { Person person = new Person("Iván", 30, "secret123"); // Serialización try (FileOutputStream fos = new FileOutputStream("person.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(person); System.out.println("Objeto serializado: " + person); } catch (IOException e) { e.printStackTrace(); }
// Deserialización try (FileInputStream fis = new FileInputStream("person.ser"); ObjectInputStream ois = new ObjectInputStream(fis)) { Person restoredPerson = (Person) ois.readObject(); System.out.println("Objeto restaurado: " + restoredPerson); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } }}Salida del programa:
Objeto serializado: Person{name='Iván', age=30, password='secret123'}Objeto restaurado: Person{name='Iván', age=30, password='null'}Observe: el campo password fue marcado con la palabra clave transient y al deserializar obtuvo el valor null. Esta es la forma estándar de excluir datos confidenciales de la serialización.
Características importantes de la serialización en Java
- serialVersionUID — identificador único de versión de la clase. Si no se declara explícitamente, la JVM lo generará automáticamente, pero esto puede provocar un error
InvalidClassExceptional modificar la clase. Se recomienda declarar siempreprivate static final long serialVersionUID. - Los campos estáticos no se serializan — pertenecen a la clase, no al objeto.
- Objetos anidados — si el objeto serializable contiene referencias a otros ob
También en la biblioteca
Envío de correo electrónico en Java: biblioteca Jakarta Mail (JavaMail)
Monitoreo de aplicaciones C++: bibliotecas y herramientas para la recopilación de métricas