Download Serialización de Objetos en Java
Document related concepts
no text concepts found
Transcript
Serialización de Objetos en Java Dra. Maricela Bravo Serialización de objetos • La serialización de un objeto consiste en obtener una secuencia de bytes que represente el estado de dicho objeto. • Esta secuencia puede utilizarse de varias maneras: ▫ enviarse a través de la red ▫ guardarse en un archivo para su uso posterior ▫ utilizarse para recomponer el objeto original. Estado de un Objeto • El estado de un objeto viene dado, básicamente, por el estado de sus campos. • Serializar un objeto consiste en guardar el estado de sus campos. • Si el objeto a serializar tiene campos que a su vez son objetos, habrá que serializarlos primero. • Es un proceso recursivo que implica la serialización de todo un árbol de objetos. • También se almacena información relativa a dicho árbol, para poder llevar a cabo la reconstrucción del objeto serializado. Modificador transient • En ocasiones puede interesar que un atributo concreto de un objeto no sea serializado. • Esto se puede conseguir utilizando el modificador transient, que informa a la JVM de que no interesa mantener el valor de ese atributo para serializarlo o hacerlo persistente. Modificador transient Ejemplo: public class MiFecha { protected int n; protected Date fecha; protected transient long s; . . . } En este ejemplo, los atributos n y fecha serán incluidos en la secuencia de bytes resultante de serializar un objeto de clase MiFecha. El atributo s no será incluido, por tener el modificador transient. Interface Serializable • Un objeto serializable es un objeto que se puede convertir en una secuencia de bytes. • Para que un objeto sea serializable, debe implementar la interfaz java.io.Serializable. • Esta interfaz no define ningún método. Simplemente se usa para 'marcar' aquellas clases cuyas instancias pueden ser convertidas a secuencias de bytes (y posteriormente reconstruidas). Interface Serializable • Para serializar un objeto no hay más que declarar el objeto como serializable: public class MiClase implements java.io.Serializable • El sistema de ejecución de Java se encarga de hacer la serialización de forma automática Almacenamiento de Objetos en un archivo FileOutputStream fos = new FileOutputStream(“archivo.bin"); FileInputStream fis = new FileInputStream(“archivo.bin"); ObjectOutputStream out = new ObjectOutputStream(fos); ObjectInputStream in = new ObjectInputStream(fis); ClaseSerializable o1 = new ClaseSerializable(); ClaseSerializable o2 = new ClaseSerializable(); // Escribir el objeto en el archivo out.writeObject(o1); out.writeObject(o2); . . . // Leer el objeto del archivo(en el mismo orden !!) o1 = (ClaseSerializable)in.readObject(); o2 = (ClaseSerializable)in.readObject(); Envío de Objetos por la Red Socket socket = new Socket(maquina, puerto); OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); ObjectOutputStream out = new ObjectOutputStream(os); ObjectInputStream in = new ObjectInputStream(is); PeticionSerializable ps = new PeticionSerializable(); RespuestaSerializable rs; // Escribir una petición en el socket out.writeObject(ps); // Recibir del socket la respuesta rs = (RespuestaSerializable)in.readObject(); Ejemplo 1 public class Employee implements java.io.Serializable { public String name; public String address; public transient int SSN; public int number; public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); } } import java.io.*; public class SerializeDemo { public static void main(String [] args) { Employee e = new Employee(); e.name = "Reyan Ali"; e.address = "Phokka Kuan, Ambehta Peer"; e.SSN = 11122333; e.number = 101; } } try { FileOutputStream fileOut = new FileOutputStream("employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(e); out.close(); fileOut.close(); System.out.printf("Serialized data is saved in /employee.ser"); }catch(IOException i) { i.printStackTrace(); } import java.io.*; public class DeserializeDemo { public static void main(String [] args) { Employee e = null; try { FileInputStream fileIn = new FileInputStream("employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); e = (Employee) in.readObject(); in.close(); fileIn.close(); }catch(IOException i) { i.printStackTrace(); return; }catch(ClassNotFoundException c) { System.out.println("Employee class not found"); c.printStackTrace(); return; } System.out.println("Deserialized Employee..."); System.out.println("Name: " + e.name); System.out.println("Address: " + e.address); System.out.println("SSN: " + e.SSN); System.out.println("Number: " + e.number); } } Ejemplo 2 import java.io.Serializable; class Agenda implements Serializable { private String nombre; private String p_Apellido; private String s_Apellido; /*getters y setters*/ public String getNombre(){ return nombre; } public void setNombre(String nombre){ this.nombre = nombre; } public String getP_Apellido(){ return p_Apellido; } public void setP_Apellido(String p_Apellido){ this.p_Apellido = p_Apellido; } public String getS_Apellido(){ return s_Apellido; } public void setS_Apellido(String s_Apellido){ this.s_Apellido = s_Apellido; } public Agenda(String nombre, String p_Apellido, String s_Apellido) { super(); this.nombre = nombre; this.p_Apellido = p_Apellido; this.s_Apellido = s_Apellido; } public String toString() { return( getNombre() + " " + getP_Apellido() + " " + getS_Apellido()); } } public class TestAgenda { public static void main(String[] args){ Agenda a1 = new Agenda("Ana", "Martínez", "Fernández"); Agenda a2 = new Agenda("Ernesto", "García", "Pérez"); try{ FileOutputStream fs = new FileOutputStream("agenda.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(a1);//El método writeObject() serializa el objeto os.writeObject(a2); os.close();//Hay que cerrar siempre el archivo }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } try{ FileInputStream fis = new FileInputStream("agenda.ser"); ObjectInputStream ois = new ObjectInputStream(fis); a1 = (Agenda) ois.readObject();//El método readObject() recupera el objeto a2 = (Agenda) ois.readObject(); ois.close(); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); } System.out.println(a1); System.out.println(a2); }}