Persistencia en Java - Serialización

17,836 views
17,437 views

Published on

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
17,836
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
189
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Persistencia en Java - Serialización

  1. 1. Persistencia en JAVA Serialización Carlos Hernando Carasol chernando@acm.org 5 de Mayo de 2011
  2. 2. Índice de contenidos Concepto de serialización Serialización en Java Objetos compuestos y complejos Elementos no serializables Extendiendo serialización Limitaciones
  3. 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. 4. Un ejemplo
  5. 5. Otros ejemplos XML JSON
  6. 6. Usos de la serialización Guardar a f chero i Transmitir por red RMI En JEE, guardar en la sesión HTTP
  7. 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. 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. 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. 10. Objeto → ExteriorObjectOutputStreamoos.writeObject(jugador)Solamente es necesario que jugadorimplemente Serializable
  11. 11. Exterior → ObjetoObjectInputStreamJugador jugador = (Jugador) ois.readObject()Es necesario que jugador implementeSerializableEs necesario realizar una conversión
  12. 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. 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. 14. Serializar un objeto compuesto Añado la clase Inventario a Jugador:public class Jugador implements Serializable{String nombre;Inventario inventario;…}
  15. 15. Todos han de ser serializablejava.io.WriteAbortedException: writing aborted;java.io.NotSerializableException: Inventario
  16. 16. Solución 1 Nos interesa serializar la estructura relacionadapublic class Inventario implements Serializable {
  17. 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. 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. 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. 20. Serializar estructuras complejas En Java los Collections son serializables
  21. 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. 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. 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. 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. 25. Ejercicio Calcular el peso del equipo con readObject
  26. 26. Ejercicio Convertir en transient: Jugador.vida Inventario.equipo Guardarlos mediante writeObject
  27. 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. 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. 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. 30. Otros uso de la serialización RMI En BBDD Criptografía
  31. 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. 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. 33. Caso práctico
  34. 34. Objetivo del caso Fijar los conocimientos de cada técnica Comprobar las diferencias entre ellas
  35. 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. 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. 37. Diseño orientativo
  38. 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

×