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 señalizado
con el resto del objeto. Al recuperarlo, lo que esté marcado como transient será (). nuil 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 señalizados. Si se quieren incluir hay que escribir el
código que lo haga. Por ejemplo, habrá que programar un método que señalice 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 lOException
prívate void readObject(ObjectlnputStream
stream) throws lOException
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.defauítWriteObject() y streani. def auItReadObject(}.
Para guardar explícitamente los tipos primitivos se puede utilizar los métodos que
proporcionan ObjectlnputStream y ObjectOutputStream. idénticos a los de DatalnputStream y
DataOutputStream (>vritelnt(). 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;
prívate void
writeObject(ObjectOutputStream stream) throws lOException {
stream.defaultWriteObject();
stream.writeDouble(g);
stream.defaultWriteObject();
stream.writeDouble(g);
}
private void
readObject(ObjectlnputStream stream) throws lOException {
stream.defaultReadObject() ;
g = stream.readDouble(g);
stream.defaultReadObject() ;
g = stream.readDouble(g);
}
No hay comentarios:
Publicar un comentario