Serialización en Java
Serialización en Java
Serialización en Java
Introducción
La serialización de un objeto consiste en obtener una secuencia de bytes que represente el
estado de dicho objeto. Esta secuencia puede utilizarse de varias maneras (puede enviarse a
través de la red, guardarse en un fichero para su uso posterior, utilizarse para recomponer el
objeto original, etc.).
Estado de un objeto
El estado de un objeto viene dado, básicamente, por el estado de sus campos. Así, serializar
un objeto consiste, básicamente, en guardar el estado de sus campos. Si el objeto a serializar
tiene campos que a su vez son objetos, habrá que serializarlos primero. Éste es un proceso
recursivo que implica la serialización de todo un grafo (en realidad, un árbol) de objetos.
Además, también se almacena información relativa a dicho árbol, para poder llevar a cabo la
reconstrucción del objeto serializado.
En ocasiones puede interesar que un atributo concreto de un objeto no sea serializado. Esto se
puede conseguir utilizando el modificador transient, que informa a la JVM de que no nos
interesa mantener el valor de ese atributo para serializarlo o hacerlo persistente.
Ejemplo:
En este ejemplo, los atributos n y fecha serán incluídos en la secuencia de bytes resultante de
serializar un objeto de clase MiFecha. El atributo s no será incluído, por tener el modificador
transient.
1
http://www.javahispano.com
Para serializar un objeto no hay más que declarar el objeto como serializable:
Ejemplos
Almacenamiento de objetos
Serialización en RMI
retorno obj.metodo(param);
2
Serialización de objetos
1. (Local) El objeto param se serializa y se envía al objeto remoto como una secuencia de
bytes
2. (Remoto) Se obtiene el objeto original a partir de la secuencia de bytes
3. (Remoto) Se ejecuta el método y se obtiene un valor de retorno
4. (Remoto) El valor de retorno se serializa y se envía como una secuencia de bytes
5. (Local) Se obtiene el retorno a partir de la secuencia de bytes
Para que esta invocación se lleve a cabo, es necesario que tanto los parámetros de las
invocaciones remotas como los valores devueltos pertenezcan a clases serializables.
Serialización personalizada
En ocasiones puede interesar tomar el control sobre el proceso de serialización de una clase en
concreto. Esto se puede hacer 'sobrecargando' los métodos writeObject y readObject de la
clase cuya serialización se quiere controlar. En realidad, no se puede hablar de sobrecarga,
puesto que estos métodos no están definidos en java.lang.Object. Este punto es un poco
oscuro. Puede consultarse el API al respecto (método writeObject(Object) de
ObjectOutputStream java.io.ObjectOutputStream y método readObject() de
ObjectInputStream) y el JavaTutorial (Essential Java Classes -> Reading and Writing (but no
'rithmetic) -> Object Serialization -> Providing Object Serialization for Your Classes).
Es necesario respetar exactamente tanto la signatura del método como la primera acción a
realizar. A continuación pueden añadirse otras acciones que escriban en el stream dado.
Aquí hay un ejemplo muy sencillo de uso de estos dos métodos. Con los println es posible
comprobar que realmente se ejecutan cuando se produce la serialización y la reconstrucción
de un objeto Prueba.
Interfaz Externalizable
3
http://www.javahispano.com
Existe una interfaz en java.io llamada Externalizable que permite obtener un mayor control
sobre el proceso de serialización y reconstrucción de nuestros objetos. Esta interfaz define dos
métodos, writeExternal y readExternal, que se encargan de serializar y reconstruir un objeto,
respectivamente.