Your SlideShare is downloading. ×
Persistencia en Java - Serialización
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Persistencia en Java - Serialización

15,865
views

Published on

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

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

Published in: Technology, News & Politics

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
15,865
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
158
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Persistencia en JAVA Serialización Carlos Hernando Carasol chernando@acm.org 5 de Mayo de 2011
  • 2. Índice de contenidos Concepto de serialización Serialización en Java Objetos compuestos y complejos Elementos no serializables Extendiendo serialización Limitaciones
  • 3. Serialización: 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
  • 4. Un ejemplo
  • 5. Otros ejemplos XML JSON
  • 6. Usos de la serialización Guardar a f chero i Transmitir por red RMI En JEE, guardar en la sesión HTTP
  • 7. Serialización en Java Se utiliza el interfaz Serializable No requiere implementación de ningún tipo Puede utilizarse en “todas” las clases Recordatorio: implements también se hereda Las principales clases de Java ya son serializables.
  • 8. Ejemplo no serializablepublic 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);}}
  • 9. Ejemplo serializablepublic 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);}}
  • 10. Objeto → ExteriorObjectOutputStreamoos.writeObject(jugador)Solamente es necesario que jugadorimplemente Serializable
  • 11. Exterior → ObjetoObjectInputStreamJugador jugador = (Jugador) ois.readObject()Es necesario que jugador implementeSerializableEs necesario realizar una conversión
  • 12. Ejemplotry {FileOutputStream fos = newFileOutputStream("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}
  • 13. 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 (podéis pedir datos) Mostrar datos, guardar y salir
  • 14. Serializar un objeto compuesto Añado la clase Inventario a Jugador:public class Jugador implements Serializable{String nombre;Inventario inventario;…}
  • 15. Todos han de ser serializablejava.io.WriteAbortedException: writing aborted;java.io.NotSerializableException: Inventario
  • 16. Solución 1 Nos interesa serializar la estructura relacionadapublic class Inventario implements Serializable {
  • 17. 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.
  • 18. Motivos para no serializar El atributo es temporal No tiene atributos, por ejemplo un controlador El atributo no debería ser persistido, por ejemplo un Thread o un Socket.
  • 19. Ejercicio Añadir la clase Inventario: dinero, l oat f capacidad, entero con valor por defecto 100 peso, entero de tipo transient Añadir un inventario al jugador. Modif car el programa para: i El jugador parte con dinero 1000.0 Muestre los atributos del Inventario antes de guardar.
  • 20. Serializar estructuras complejas En Java los Collections son serializables
  • 21. Deep / Shallow copy 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
  • 22. Ejercicio Añadimos la clase Equipo: nombre, string cantidad, entero positivo peso (por unidad), entero positivo Añadimos una lista de equipo al inventario Mostramos la lista de todo el equipo.
  • 23. Ampliar métodos de serializaciónprivate voidwriteObject(java.io.ObjectOutputStream out) throws IOExceptionprivate voidreadObject(java.io.ObjectInputStream in) throws IOException,ClassNotFoundException;private void readObjectNoData() throws ObjectStreamException;
  • 24. Ejemploprivate void readObject(ObjectInputStream in) throwsIOException,ClassNotFoundException {in.defaultReadObject();// Haciendo trampasSystem.out.println("Inventario - dinero: " +this.inventario.dinero);this.inventario.dinero += 100;System.out.println("Inventario - dinero: " +this.inventario.dinero);}
  • 25. Ejercicio Calcular el peso del equipo con readObject
  • 26. Ejercicio Convertir en transient: Jugador.vida Inventario.equipo Guardarlos mediante writeObject
  • 27. Limitar la serialización Sobrescribir los métodos provocando excepcionesprivate void writeObject(ObjectOutputStream out) throwsIOException {throw new NotSerializableException("No!");}private void readObject(ObjectInputStream in) throwsIOException {throw new NotSerializableException("No!");
  • 28. Problemas de la serialización Cambios en la clase Por ejemplo añadir/eliminar un campo Para guardar no hay problema Al recuperar provocará excepciones: java.io.InvalidClassException
  • 29. serialVersionUID La solución consiste en identif car la clase i Utilizamos serialver o Eclipsepublic class Jugador implements Serializable {private static final long serialVersionUID =77552270920966258L;
  • 30. Otros uso de la serialización RMI En BBDD Criptografía
  • 31. 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);
  • 32. Más información 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
  • 33. Caso práctico
  • 34. Objetivo del caso Fijar los conocimientos de cada técnica Comprobar las diferencias entre ellas
  • 35. Especificaciones generales Debe posibilitar la visualización y edición de datos. Debido a su evolución es recomendable utilizar un buen diseño
  • 36. Gestor de Tareas Tarea Notas Descripción Una persona Fecha de registro puede tener múltiples tareas Persona asignada Un proyecto tiene Persona múltiples tareas. Nombre Proyecto Nombre
  • 37. Diseño orientativo
  • 38. Resumen de Serialización Ventajas: Desventajas: Sencillo Rudimentario Sin dependencias Sufre con los Inmediato cambios Flexible Sufre con las corrupciones No vale para grandes cantidades de datos