Serialización de objetos en Java
Enviado por davoxzs • 18 de Junio de 2014 • Tutorial • 3.918 Palabras (16 Páginas) • 341 Visitas
Serialización de objetos en Java
DESCRIPCIÓN
Este artículo describe la serialización de objetos en Java, de forma aplicada, mediante ejemplos.
Introducción
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 (puede enviarse a través de la red, guardarse en un fichero para su uso posterior, utilizarse para recomponer el objeto original, etc.).
ESTADO DE UN OBJETO
El estado de un objeto viene dado, básicamente, por el estado de sus campos. Así, serializar un objeto consiste, básicamente, en guardar el estado de sus campos. Si el objeto a serializar tiene campos que a su vez son objetos, habrá que serializarlos primero. Éste es un proceso recursivo que implica la serialización de todo un grafo (en realidad, un árbol) de objetos.
Además, también se almacena información relativa a dicho árbol, para poder llevar a cabo la reconstrucción del objeto serializado.
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 nos interesa mantener el valor de ese atributo para serializarlo o hacerlo persistente.
OBJETOS SERIALIZABLES. INTERFAZ 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 reconstruídas). Objetos tan comunes como String, Vector o ArrayList implementan Serializable, de modo que pueden ser serializados y reconstruídos más tarde.
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.
Java ha añadido una interesante faceta al lenguaje denominada serialización de objetos que permite convertir cualquier objeto cuya clase implemente el interface Serializable en una secuencia de bytes que pueden ser posteriormente leídos para restaurar el objeto original. Esta característica se mantiene incluso a través de la red, por lo que podemos crear un objeto en un ordenador que corra bajo Windows 95/98, serializarlo y enviarlo a través de la red a una estación de trabajo que corra bajo UNIX donde será correctamente reconstruido. No tenemos que procuparnos, en absoluto, de las diferentes representaciones de datos en los distintos ordenadores.
La serialización es una característica añadida al lenguaje Java para dar soporte a
• La invocación remota de objetos (RMI)
• La persistencia
La invocación remota de objetos permite a los objetos que viven en otros ordenadores comportarse como si vivieran en nuestra propia máquina. La serialización es necesaria para transportar los argumentos y los valores de retorno.
La persistencia, es una característica importante de los JavaBeans. El estado de un componente es configurado durante el diseño. La serialización nos permite guardar el estado de un componente en disco, abandonar el Entorno Integrado de Desarrollo (IDE) y restaurar el estado de dicho componente cuando se vuelve a correr el IDE.
El interface Serializable
Un objeto se puede serializar si implementa el interface Serializable. Este interface no declara ninguna función miembro, se trata de un interface vacío.
import java.io.*;
public interface Serializable{
}
Para hacer una clase serializable simplemente ha de implementar el interface Serializable, por ejemplo, a la clase Lista que estudiamos en el capítulo Clases y objetos se le añade la implementación del interface
public class Lista implements java.io.Serializable{
private int[] x;
private int n;
//otros miembros...
}
No tenemos que escribir ningún otro método. El método defaultWriteObject de la clase ObjectOutputStream realiza la serialización de los objetos de una clase. Este método escribe en el flujo de salida todo lo necesario para reconstruir dichos objetos:
• La clase del objeto
• La firma de la clase (class signature)
• Los valores de los miembros que no tengan los modificadores static o transient, incluyendo los miembros que se refieren a otros objetos.
El método defaultReadObject de la clase ObjectInputStream realiza la deserialización de los objetos de una clase. Este método lee el flujo de entrada y reconstruye los objetos de dicha clase.
Lectura/escritura
Lista.java
package archivo4;
public class Lista implements java.io.Serializable{
private int[] x; //array de datos
private int n; //dimensión
public Lista(int[] x) {
this.x=x;
n=x.length;
ordenar();
}
public double valorMedio(){
int suma=0;
for(int i=0; i<n; i++){
suma+=x[i];
}
return (double)suma/n;
}
public int valorMayor(){
return x[n-1];
}
public int valorMenor(){
return x[0];
}
private void ordenar(){
int aux;
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(x[i]>x[j]){
aux=x[j];
x[j]=x[i];
x[i]=aux;
}
}
}
}
public String toString(){
String texto="";
for(int i=0; i<n; i++){
texto+="\t"+x[i];
}
return texto;
}
}
ArchivoApp4.java
package archivo4;
import java.io.*;
import java.util.*;
public class ArchivoApp4 {
public static void main(String[] args) {
Lista lista1= new Lista(new int[]{12, 15, 11, 4, 32});
try {
ObjectOutputStream salida=new ObjectOutputStream(new FileOutputStream("media.obj"));
salida.writeObject("guardar este string y un objeto\n");
salida.writeObject(lista1);
...