La serialización es un mecanismo que convierte un objeto en un flujo de bytes para su almacenamiento o transferencia. En Java, la serialización apareció con la plataforma en la versión 1.1 como parte de la API debido a la popularidad de las aplicaciones distribuidas y la necesidad de intercambiar datos entre ellas. Esta solución permitió simplificar la transmisión de complejos grafos de objetos entre JVM y almacenar su estado, haciendo el proceso transparente para el desarrollador.
El problema de la serialización radica en la necesidad de mantener la integridad de los datos, soportar la versionado de clases y manejar correctamente estructuras complejas (por ejemplo, grafos con referencias cíclicas). No todos los objetos son serializables (por ejemplo, flujos, sockets, recursos del sistema operativo), y la serialización requiere atención especial a la seguridad.
La solución se implementa mediante la interfaz Serializable:
import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private transient int age; // no se serializa public Person(String name, int age) { this.name = name; this.age = age; } }
Con ObjectOutputStream y ObjectInputStream, se puede escribir un objeto en un archivo y restaurarlo:
Person p = new Person("Alice", 30); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser")); oos.writeObject(p); // serialización ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); Person restored = (Person) ois.readObject();
Características clave:
Serializable.transient no se serializan.¿Se puede serializar un objeto con un campo no serializable, incluso si no se usa?
Respuesta: Si el campo se marca como transient, no se serializa en absoluto, y el proceso no lanzará una excepción, incluso si su tipo no implementa Serializable. Si el campo no es serializable y no es transient, se lanzará una excepción NotSerializableException.
¿Es serializable un campo estático si la clase implementa Serializable?
Respuesta: No, los campos estáticos no se serializan porque pertenecen a la clase y no a la instancia. Solo se guarda el estado de la instancia.
¿Qué sucederá si se cambia la estructura de la clase después de la serialización (por ejemplo, agregar o eliminar un campo)?
Respuesta: Si se especifica la versión serialVersionUID y la estructura ha cambiado de manera incompatible, al deserializar aparecerá una InvalidClassException. Para asegurar la compatibilidad, se utilizan pistas de serialización y gestión manual de serialVersionUID.
Ingenieros decidieron serializar un objeto sin agregar serialVersionUID y sin declarar los campos que referencian recursos del sistema operativo como transient. Después de actualizar la aplicación y la clase, se produjo un InvalidClassException y el objeto perdió su integridad, y la deserialización dejó de funcionar.
Ventajas:
Desventajas:
Se implementó una clase portátil para la serialización con un serialVersionUID explícito, todos los campos-recurso se declararon como transient, y la serialización manual controla los puntos clave.
Ventajas:
Desventajas: