Como ya se ha comentado en la revista, la serialización permite guardar el estado de uno o varios objetos en el disco duro. Es importante conocer las bases de la serialización antes de ponernos en marcha y escribir aplicaciones que hagan uso de esta tecnología.
La serialización de Java se basa en escanear el objeto que deseamos guardar en disco y guardar todos aquellas variables (tanto públicas como privadas) que el objeto contenga. En realidad, la máquina virtual no graba en el disco la estructura del objeto en sí, es decir, propiedades y métodos, sino solamente las variables.
La máquina virtual también se encarga de buscar sub-objetos que se encuentren en la clase que deseamos serializar. Es básicamente un proceso recursivo.
Si deseamos hacer uso de la serialización deberemos tener en cuenta que cuando deseamos cargar de nuevo un objeto que ha sido previamente serializado deberemos, sin duda, disponer de acceso a la clase a la que disponen los datos serializados, puesto que en realidad, como hemos comentado anteriormente, sólo se graban en disco las variables públicas y privadas del objeto.
Es importante destacar, a la vez, que si realizamos cambios en la clase correspondiente (como por ejemplo, borrar variables o alterar su orden) el proceso de carga del objeto serializado podría no funcionar, puesto que la máquina virtual podría intentar asignar datos a una variable de la clase que ya no existe o es incorrecta.
Es por eso que sólo deberemos serializar todos aquellos objetos que sepamos que no van a sufrir ningún cambio en su estructura, es decir, versiones ya definitivas de ese objeto.
Todos los objetos que deseemos serializar deberán implementar la interfaz java.io.Serializable, que indica a la máquina virtual que el objeto en cuestión puede ser serializable. Todos los objetos de una clase que vayamos a serializar, también deberán implementar esta interfaz. Si intentamos serializar un objeto que no implementa esta interfaz, la máquina virtual lanzará una excepción, puesto que en realidad estará intentando serializar un objeto que no ha estado preparado para ello.
Puesto que Java soporta de por sí la serialización de objetos, muchas de las clases que pertenecen al propio lenguaje Java ya han estado declaradas con la interfaz java.io.Serializable implementada. Esto significa que si en nuestro objeto que deseamos guardar en el disco duro tenemos, por ejemplo, un objeto Hashtable (java.util.Hashtable) no deberemos preocuparnos, pues el proceso de serialización de este objeto se realizará sin problemas. Pero debemos tener en cuenta que cualquier otro objeto que hayamos creado nosotros a mano no es serializable por defecto.
He aquí un ejemplo de serialización. El siguiente programa define una clase, a la cual denominaremos ClaseSerial, que guardaremos en el disco duro y posteriormente la cargaremos de nuevo.
Veamos el ejemplo:
Ejemplo 1
La clase a serializar: import java.io.*; public int a; public int b; public ClaseSerial () { a = 5; b = 5; } } |
||
Ejemplo 2
La clase que serializa el objeto ClaseSerial: import java.io.*; { ClaseSerial primera = new ClaseSerial(); // Serializamos el objeto try { ObjectOutputStream oos = new ObjectOutputStream ( ostream ); // guardamos el objeto en el disco oos.writeObject ( primera ); oos.flush(); ostream.close(): } } ObjectInputStream in = new ObjectInputStream ( ostream ); // cargamos el objeto Object o = in.readObject(); in.close(); // Hacemos un cast para convertir de Object a ClaseSerial segunda = (ClaseSerial)o; } } } } |
||
Aquellos de vosotros que estéis familiarizados con los procesos de entrada y salida de datos en Java, podréis comprobar que existe poca diferencia entre escribir datos tales como enteros, Strings, etc. o escribir un objeto entero.
El único requisito importante para serializar un objeto es que esté preparado para ello mediante la implementación de la interfaz java.io.*. Haciendo esto y siguiendo las normas que se han expuesto en este artículo podréis dotar a vuestros programas de una de las características de Java más útiles.