Persistencia en Java - Serialización

Post on 14-Dec-2014

15.479 views 6 download

description

Curso (y ejercicios) del uso de la serialización como técnica de persistencia en Java.

Transcript of Persistencia en Java - Serialización

Persistencia en JAVASerialización

Carlos Hernando Carasolchernando@acm.org

5 de Mayo de 2011

Índice de contenidos

Concepto de serializaciónSerialización en JavaObjetos compuestos y complejosElementos no serializablesExtendiendo serializaciónLimitaciones

Serialización: concepto

“... is the process of converting a data structure or object into a format that can be stored” WikipediaAplanar estructuras… en un formato que pueda reconstruir

Un ejemplo

Otros ejemplos

XMLJSON

Usos de la serialización

Guardar a fi cheroTransmitir por redRMIEn JEE, guardar en la sesión HTTP

Serialización en Java

Se utiliza el interfaz SerializableNo requiere implementación de ningún tipoPuede utilizarse en “todas” las clases

Recordatorio: implements también se hereda

Las principales clases de Java ya son serializables.

Ejemplo no serializable

public class Jugador {

String nombre;

public Jugador(String nombre) {

this.nombre = nombre;

}

public static void main(String[] args) {

Jugador jugador = new Jugador("Carlos");

System.out.println(jugador.nombre);

}

}

Ejemplo serializable

public class Jugador implements Serializable {

String nombre;

public Jugador(String nombre) {

this.nombre = nombre;

}

public static void main(String[] args) {

Jugador jugador = new Jugador("Carlos");

System.out.println(jugador.nombre);

}

}

Objeto → Exterior

ObjectOutputStreamoos.writeObject(jugador)Solamente es necesario que jugador implemente Serializable

Exterior → Objeto

ObjectInputStreamJugador jugador = (Jugador) ois.readObject()Es necesario que jugador implemente SerializableEs necesario realizar una conversión

Ejemplo

try {

FileOutputStream fos = new FileOutputStream("fichero.bin");

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(jugador);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

} catch (IOException e) {

// TODO Auto-generated catch block

}

Ejercicio

Crear una clase Jugador:nombre, cadenavida, entero de 0 a 100últimaEntrada, fecha con la última vez que guardo

Crear un programa (no es necesario UI):Si hay jugador guardado, recuperar (preguntar)Si no hay, crear uno (podéis pedir datos)Mostrar datos, guardar y salir

Serializar un objeto compuesto

Añado la clase Inventario a Jugador:public class Jugador implements Serializable{

String nombre;

Inventario inventario;

}

Todos han de ser serializable

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: Inventario

Solución 1

Nos interesa serializar la estructura relacionada

public class Inventario implements Serializable {

Solución 2

No nos interesa serializar la estructura relacionada:

transient Inventario inventario;

Recordatorio: la estructura se pierde por el camino, al recuperar será Null.

Motivos para no serializar

El atributo es temporalNo tiene atributos, por ejemplo un controladorEl atributo no debería ser persistido, por ejemplo un Thread o un Socket.

Ejercicio

Añadir la clase Inventario:dinero, fl oatcapacidad, entero con valor por defecto 100peso, entero de tipo transient

Añadir un inventario al jugador.Modifi car el programa para:

El jugador parte con dinero 1000.0Muestre los atributos del Inventario antes de guardar.

Serializar estructuras complejas

En Java los Collections son serializables

Deep / Shallow copy

Profundidad de la copiaSerializable � Deep

Se realiza una copia de todos los elementos

Clone � Shallow Se copia la instancia y se referencia el resto

Ejercicio

Añadimos la clase Equipo:nombre, stringcantidad, entero positivopeso (por unidad), entero positivo

Añadimos una lista de equipo al inventarioMostramos la lista de todo el equipo.

Ampliar métodos de serialización

private void writeObject(java.io.ObjectOutputStream out) throws IOExceptionprivate void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;private void readObjectNoData() throws ObjectStreamException;

Ejemplo

private void readObject(ObjectInputStream in) throws IOException,

ClassNotFoundException {

in.defaultReadObject();

// Haciendo trampas

System.out.println("Inventario - dinero: " + this.inventario.dinero);

this.inventario.dinero += 100;

System.out.println("Inventario - dinero: " + this.inventario.dinero);

}

Ejercicio

Calcular el peso del equipo con readObject

Ejercicio

Convertir en transient:Jugador.vidaInventario.equipo

Guardarlos mediante writeObject

Limitar la serialización

Sobrescribir los métodos provocando excepciones

private void writeObject(ObjectOutputStream out) throws IOException {

throw new NotSerializableException("No!");

}

private void readObject(ObjectInputStream in) throws IOException {

throw new NotSerializableException("No!");

Problemas de la serialización

Cambios en la clasePor ejemplo añadir/eliminar un campo

Para guardar no hay problemaAl recuperar provocará excepciones:java.io.InvalidClassException

serialVersionUID

La solución consiste en identifi car la claseUtilizamos serialver o Eclipse

public class Jugador implements Serializable {

private static final long serialVersionUID = 77552270920966258L;

Otros uso de la serialización

RMIEn BBDDCriptografía

Ejemplo de Cripto

FileOutputStream fos = new FileOutputStream("out.des"); BufferedOutputStream bos = new BufferedOutputStream(fos); CipherOutputStream cos = new CipherOutputStream(bos, desCipher); ObjectOutputStream oos = new ObjectOutputStream(cos);

Más información

Discover the secrets of the Java Serialization API

http://java.sun.com/developer/technicalArticles/Programming/serialization/

Advanced Serializationhttp://java.sun.com/developer/technicalArticles/ALT/serialization/

Interface Serializablehttp://download.oracle.com/javase/6/docs/api/java/io/Serializable.html

Caso práctico

Objetivo del caso

Fijar los conocimientos de cada técnicaComprobar las diferencias entre ellas

Especificaciones generales

Debe posibilitar la visualización y edición de datos.Debido a su evolución es recomendable utilizar un buen diseño

Gestor de Tareas

TareaDescripciónFecha de registroPersona asignada

PersonaNombre

ProyectoNombre

NotasUna persona puede tener múltiples tareasUn proyecto tiene múltiples tareas.

Diseño orientativo

Resumen de Serialización

Ventajas:SencilloSin dependenciasInmediatoFlexible

Desventajas:RudimentarioSufre con los cambiosSufre con las corrupcionesNo vale para grandes cantidades de datos