Control de la serialización

Aunque lo mejor de la serialización es que su comportamiento automático es bueno y sencillo, existe la posibilidad de especificar cómo se deben hacer las cosas.

La palabra clave transient permite indicar que un objeto o varible miembro no sea serializado con el resto del objeto. Al recuperarlo, lo que esté marcado como transient será 0, null o false (en esta operación no se llama a ningún constructor) hasta que se le dé un nuevo valor. Podría ser el caso de un password que no se quiere guardar por seguridad.

Las variables y objetos static no son serializados. Si se quieren incluir hay que escribir el código que lo haga. Por ejemplo, habrá que programar un método que serialice los objetos estáticos al que se llamará después de serializar el resto de los elementos. También habría que recuperarlos explícitamente después de recuperar el resto de los objetos.

Las clases que implementan Serializable pueden definir dos métodos con los que controlar la serialización. No están obligadas a hacerlo porque una clase sin estos métodos obtiene directamente el comportamiento por defecto. Si los define serán los que se utilicen al serializar:

– private void writeObject(ObjectOutputStream stream) throws IOException
– private void readObject(ObjectInputStream stream) throws IOException

El primero permite indicar qué se escribe o añadir otras instrucciones al comportamiento por defecto. El segundo debe poder leer lo que escribe writeObject(). Puede usarse por ejemplo para poner al día las variables que lo necesiten al ser recuperado un objeto. Hay que leer en el mismo orden en que se escribieron los objetos.

Se puede obtener el comportamiento por defecto dentro de estos métodos llamando a stream.defaultWriteObject() y stream.defaultReadObject().

Para guardar explícitamente los tipos primitivos se puede utilizar los métodos que proporcionan ObjectInputStream y ObjectOutputStream, idénticos a los de DataInputStream y

DataOutputStream (writeInt(), readDouble(), …) o guardar objetos de sus clases equivalentes (Integer, Double…).

Por ejemplo, si en una clase llamada Tierra se necesita que al serializar un objeto siempre le acompañe la constante g (9,8) definida como static el código podría ser:

static double g = 9.8;

private void writeObject(ObjectOutputStream stream) throws IOException { stream.defaultWriteObject();
stream.writeDouble(g);
}
private void readObject(ObjectInputStream stream) throws IOException { stream.defaultReadObject();
g = stream.readDouble(g);
}

Fuente: Aprenda Java como si estuviera en primero de la Universidad de Navarra