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