Persistencia en Java - Serialización

38
Persistencia en JAVA Serialización Carlos Hernando Carasol [email protected] 5 de Mayo de 2011

description

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

Transcript of Persistencia en Java - Serialización

Page 1: Persistencia en Java - Serialización

Persistencia en JAVASerialización

Carlos Hernando [email protected]

5 de Mayo de 2011

Page 2: Persistencia en Java - Serialización

Índice de contenidos

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

Page 3: Persistencia en Java - Serialización

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

Page 4: Persistencia en Java - Serialización

Un ejemplo

Page 5: Persistencia en Java - Serialización

Otros ejemplos

XMLJSON

Page 6: Persistencia en Java - Serialización

Usos de la serialización

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

Page 7: Persistencia en Java - Serialización

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.

Page 8: Persistencia en Java - Serialización

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);

}

}

Page 9: Persistencia en Java - Serialización

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);

}

}

Page 10: Persistencia en Java - Serialización

Objeto → Exterior

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

Page 11: Persistencia en Java - Serialización

Exterior → Objeto

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

Page 12: Persistencia en Java - Serializació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

}

Page 13: Persistencia en Java - Serialización

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

Page 14: Persistencia en Java - Serialización

Serializar un objeto compuesto

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

String nombre;

Inventario inventario;

}

Page 15: Persistencia en Java - Serialización

Todos han de ser serializable

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

Page 16: Persistencia en Java - Serialización

Solución 1

Nos interesa serializar la estructura relacionada

public class Inventario implements Serializable {

Page 17: Persistencia en Java - Serialización

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.

Page 18: Persistencia en Java - Serialización

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.

Page 19: Persistencia en Java - Serialización

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.

Page 20: Persistencia en Java - Serialización

Serializar estructuras complejas

En Java los Collections son serializables

Page 21: Persistencia en Java - Serialización

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

Page 22: Persistencia en Java - Serialización

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.

Page 23: Persistencia en Java - Serialización

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;

Page 24: Persistencia en Java - Serialización

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);

}

Page 25: Persistencia en Java - Serialización

Ejercicio

Calcular el peso del equipo con readObject

Page 26: Persistencia en Java - Serialización

Ejercicio

Convertir en transient:Jugador.vidaInventario.equipo

Guardarlos mediante writeObject

Page 27: Persistencia en Java - Serialización

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!");

Page 28: Persistencia en Java - Serialización

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

Page 29: Persistencia en Java - Serialización

serialVersionUID

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

public class Jugador implements Serializable {

private static final long serialVersionUID = 77552270920966258L;

Page 30: Persistencia en Java - Serialización

Otros uso de la serialización

RMIEn BBDDCriptografía

Page 31: Persistencia en Java - Serialización

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);

Page 32: Persistencia en Java - Serialización

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

Page 33: Persistencia en Java - Serialización

Caso práctico

Page 34: Persistencia en Java - Serialización

Objetivo del caso

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

Page 35: Persistencia en Java - Serialización

Especificaciones generales

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

Page 36: Persistencia en Java - Serialización

Gestor de Tareas

TareaDescripciónFecha de registroPersona asignada

PersonaNombre

ProyectoNombre

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

Page 37: Persistencia en Java - Serialización

Diseño orientativo

Page 38: Persistencia en Java - Serialización

Resumen de Serialización

Ventajas:SencilloSin dependenciasInmediatoFlexible

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