lunes, 9 de junio de 2014

Control (le 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 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);
}
private void readObject(ObjectlnputStream stream) throws lOException {
stream.defaultReadObject() ;
g = stream.readDouble(g);
}

No hay comentarios:

Publicar un comentario