You are on page 1of 38

Persistencia en JAVA

Serializacin

Carlos Hernando Carasol chernando@acm.org 5 de Mayo de 2011

ndice de contenidos
Concepto de serializacin Serializacin en Java Objetos compuestos y complejos Elementos no serializables Extendiendo serializacin Limitaciones

Serializacin: concepto
... is the process of converting a data structure or object into a format that can be stored Wikipedia Aplanar estructuras en un formato que pueda reconstruir

Un ejemplo

Otros ejemplos
XML JSON

Usos de la serializacin
Guardar a f i chero Transmitir por red RMI En JEE, guardar en la sesin HTTP

Serializacin en Java
Se utiliza el interfaz Serializable No requiere implementacin de ningn tipo Puede utilizarse en todas las clases
Recordatorio: implements tambin 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 = ne } } Jugador(!"arlos!); S#stem.out.println(jugador.nombre);

Ejemplo serializable
public class Jugador implements Seriali$able { String nombre; public Jugador(String nombre) { this.nombre = nombre; } public static void main(String[] args) { Jugador jugador = ne } } Jugador(!"arlos!); S#stem.out.println(jugador.nombre);

Objeto Exterior
ObjectOutputStream oos.writeObject(jugador) Solamente es necesario que jugador implemente Serializable

Exterior Objeto
ObjectInputStream Jugador jugador = (Jugador) ois.readObject() Es necesario que jugador implemente Serializable Es necesario realizar una conversin

Ejemplo
tr# { %ile&utputStream 'os = ne %ile&utputStream(!'ichero.bin!); &bject&utputStream oos = ne oos. rite&bject(jugador); } catch (%ile(ot%ound)*ception e) { ++ ,&-& .uto/generated catch bloc0 } catch (1&)*ception e) { ++ ,&-& .uto/generated catch bloc0 } &bject&utputStream('os);

Ejercicio
Crear una clase Jugador:
nombre, cadena vida, 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 (podis pedir datos) Mostrar datos, guardar y salir

Serializar un objeto compuesto


Aado la clase Inventario a Jugador:
public class Jugador implements Seriali$able{ String nombre; 1nventario inventario; 2 }

odos !an de ser serializable


java.io.3rite.borted)*ception4 riting aborted; java.io.(otSeriali$able)*ception4 1nventario

Solucin "
Nos interesa serializar la estructura relacionada
public class 1nventario implements Seriali$able {

Solucin #
No nos interesa serializar la estructura relacionada:
transient 1nventario inventario;

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

$otivos para no serializar


El atributo es temporal No tiene atributos, por ejemplo un controlador El atributo no debera ser persistido, por ejemplo un Thread o un Socket.

Ejercicio
Aadir la clase Inventario:
dinero, l f oat capacidad, entero con valor por defecto 100 peso, entero de tipo transient

Aadir un inventario al jugador. Modif i car el programa para:


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

Serializar estructuras complejas


En Java los Collections son serializables

%eep & S!allo' cop(


Profundidad de la copia Serializable Deep
Se realiza una copia de todos los elementos

Clone

Shallow

Se copia la instancia y se referencia el resto

Ejercicio
Aadimos la clase Equipo:
nombre, string cantidad, entero positivo peso (por unidad), entero positivo

Aadimos una lista de equipo al inventario Mostramos la lista de todo el equipo.

Ampliar m)todos de serializacin


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

Ejemplo
private void read&bject(&bject1nputStream in) thro s 1&)*ception5 "lass(ot%ound)*ception { in.de'ault6ead&bject(); ++ 7aciendo trampas S#stem.out.println(!1nventario / dinero4 ! 8 this.inventario.dinero); this.inventario.dinero 8= 9::; S#stem.out.println(!1nventario / dinero4 ! 8 this.inventario.dinero); }

Ejercicio
Calcular el peso del equipo con readObject

Ejercicio
Convertir en transient:
Jugador.vida Inventario.equipo

Guardarlos mediante writeObject

*imitar la serializacin
Sobrescribir los mtodos provocando excepciones
private void rite&bject(&bject&utputStream out) thro s 1&)*ception { thro } private void read&bject(&bject1nputStream in) thro s 1&)*ception { thro ne (otSeriali$able)*ception(!(o;!); ne (otSeriali$able)*ception(!(o;!);

Problemas de la serializacin
Cambios en la clase
Por ejemplo aadir/eliminar un campo

Para guardar no hay problema Al recuperar provocar excepciones: java.io.InvalidClassException

serialVersionU+%
La solucin consiste en identif i car la clase Utilizamos serialver o Eclipse
public class Jugador implements Seriali$able { private static 'inal long serial<ersion=1- = >>??@@>:A@:ABB@?CD;

Otros uso de la serializacin


RMI En BBDD Criptografa

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

$-s in.ormacin
Discover the secrets of the Java Serialization API
http://java.sun.com/developer/technicalArticles/Programming/serialization/

Advanced Serialization
http://java.sun.com/developer/technicalArticles/ALT/serialization/

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

,aso pr-ctico

Objetivo del caso


Fijar los conocimientos de cada tcnica Comprobar las diferencias entre ellas

Especi.icaciones /enerales
Debe posibilitar la visualizacin y edicin de datos. Debido a su evolucin es recomendable utilizar un buen diseo

0estor de areas
Tarea
Descripcin Fecha de registro Persona asignada

Notas
Una persona puede tener mltiples tareas Un proyecto tiene mltiples tareas.

Persona
Nombre

Proyecto
Nombre

%ise1o orientativo

2esumen de Serializacin
Ventajas:
Sencillo Sin dependencias Inmediato Flexible

Desventajas:
Rudimentario Sufre con los cambios Sufre con las corrupciones No vale para grandes cantidades de datos

You might also like