SlideShare una empresa de Scribd logo
1 de 4
Descargar para leer sin conexión
Serialización de objetos




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.

Ejemplo:

  public class MiFecha
  {
    protected int n;
    protected Date fecha;
    protected transient long s;
    . . .
  }

En este ejemplo, los atributos n y fecha serán incluídos en la secuencia de bytes resultante de
serializar un objeto de clase MiFecha. El atributo s no será incluído, por tener el modificador
transient.

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.

                                                                                                       1
http://www.javahispano.com


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.

Ejemplos
Almacenamiento de objetos

Es posible utilizar los mecanismos de serialización disponibles para serializar un objeto
guardándolo en un fichero y para realizar el proceso inverso, recuperándolo desde el fichero.

    FileOutputStream fos = new FileOutputStream("fichero.bin");
    FileInputStream fis = new FileInputStream("fichero.bin");
    ObjectOutputStream out = new ObjectOutputStream(fos);
    ObjectInputStream in = new ObjectInputStream(fis);

    ClaseSerializable o1 = new ClaseSerializable();
    ClaseSerializable o2 = new ClaseSerializable();

    // Escribir el objeto en el fichero
    out.writeObject(o1);
    out.writeObject(o2);
    . . .
    // Leer el objeto del fichero (en el mismo orden !!)
    o1 = (ClaseSerializable)in.readObject();
    o2 = (ClaseSerializable)in.readObject();


Envío de objetos por la red

También es posible enviar un objeto serializado a través de la red. La diferencia consiste en
que ahora se utilizan streams de distinto tipo.

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


Serialización en RMI

En RMI, la serialización se utiliza de forma casi transparente al usuario. Concretamente, se
utiliza en el paso de parámetros y retorno de valores de las invocaciones a métodos de objetos
remotos. Por ejemplo, cuando hacemos una invocación remota del tipo

    retorno obj.metodo(param);


2
Serialización de objetos


ocurre el siguiente proceso, de forma transparente al usuario:

     1. (Local) El objeto param se serializa y se envía al objeto remoto como una secuencia de
        bytes
     2. (Remoto) Se obtiene el objeto original a partir de la secuencia de bytes
     3. (Remoto) Se ejecuta el método y se obtiene un valor de retorno
     4. (Remoto) El valor de retorno se serializa y se envía como una secuencia de bytes
     5. (Local) Se obtiene el retorno a partir de la secuencia de bytes

Para que esta invocación se lleve a cabo, es necesario que tanto los parámetros de las
invocaciones remotas como los valores devueltos pertenezcan a clases serializables.

´

Serialización personalizada
En ocasiones puede interesar tomar el control sobre el proceso de serialización de una clase en
concreto. Esto se puede hacer 'sobrecargando' los métodos writeObject y readObject de la
clase cuya serialización se quiere controlar. En realidad, no se puede hablar de sobrecarga,
puesto que estos métodos no están definidos en java.lang.Object. Este punto es un poco
oscuro. Puede consultarse el API al respecto (método writeObject(Object) de
ObjectOutputStream java.io.ObjectOutputStream y método readObject() de
ObjectInputStream) y el JavaTutorial (Essential Java Classes -> Reading and Writing (but no
'rithmetic) -> Object Serialization -> Providing Object Serialization for Your Classes).

Para 'personalizar' la serialización de un objeto, basta añadir un método tal que:


    private void writeObject (ObjectOutputStream stream)
                 throws IOException
    {
      stream.defaultWriteObject();
      . . .
    }

Es necesario respetar exactamente tanto la signatura del método como la primera acción a
realizar. A continuación pueden añadirse otras acciones que escriban en el stream dado.

También será necesario añadir un método para hacer el paso inverso:

    private void readObject (ObjectInputStream stream)
                 throws IOException
    {
      stream.defaultReadObject();
      . . .
    }

Aquí hay un ejemplo muy sencillo de uso de estos dos métodos. Con los println es posible
comprobar que realmente se ejecutan cuando se produce la serialización y la reconstrucción
de un objeto Prueba.

Interfaz Externalizable

                                                                                                           3
http://www.javahispano.com


Existe una interfaz en java.io llamada Externalizable que permite obtener un mayor control
sobre el proceso de serialización y reconstrucción de nuestros objetos. Esta interfaz define dos
métodos, writeExternal y readExternal, que se encargan de serializar y reconstruir un objeto,
respectivamente.

La serialización mediante Externalizable requiere de un mayor cuidado. De forma automática,
sólo se guarda información relativa a la identidad de la clase del objeto que se está
serializando. No se guarda automáticamente ni su estado ni información relativa a sus
superclases. Por ello, en la implementación de writeExternal hay que guardar explícitamente
el estado de aquellos atributos que nos interesen, incluídos los heredados. A la hora de
implementar writeExternal y readExternal, se ha de tener muy en cuenta la serialización de las
clases superiores en el grafo de herencia y coordinar la implementación de estos métodos con
la de los mismos métodos en clases superiores.

Emili Miedes es Ingeniero en Informática y trabaja de momento para el Instituto
Tecnológico de Informática de la Universidad Politécnica de Valencia desarrollando en Java.
Desarrollador opensource en sus ratos libres (buscar por emiedes en Sourceforge) anda
buscando colaboración para acabar todo lo que empieza.
Para cualquier duda o tirón de orejas, e-mail a: emiedes@iti.upv.es




4

Más contenido relacionado

La actualidad más candente

La actualidad más candente (19)

Contructores en java(grupo 8)
Contructores en java(grupo 8)Contructores en java(grupo 8)
Contructores en java(grupo 8)
 
Persistencia en Java - Serialización
Persistencia en Java - SerializaciónPersistencia en Java - Serialización
Persistencia en Java - Serialización
 
Programación Orientada a Objetos
Programación Orientada a ObjetosProgramación Orientada a Objetos
Programación Orientada a Objetos
 
Destructores
Destructores Destructores
Destructores
 
Programación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructoresProgramación Orientada a Objetos - constructores y destructores
Programación Orientada a Objetos - constructores y destructores
 
Serializacion de objetos en java
Serializacion de objetos en javaSerializacion de objetos en java
Serializacion de objetos en java
 
Serializacion de objetos en java
Serializacion de objetos en javaSerializacion de objetos en java
Serializacion de objetos en java
 
Uso de Excepciones en JAVA
Uso de Excepciones en JAVAUso de Excepciones en JAVA
Uso de Excepciones en JAVA
 
Recolección de basura
Recolección de basuraRecolección de basura
Recolección de basura
 
Serializacion
SerializacionSerializacion
Serializacion
 
Networking
NetworkingNetworking
Networking
 
INSTANCIAS Y CONSTRUCTORES EN JAVA
INSTANCIAS Y CONSTRUCTORES EN JAVAINSTANCIAS Y CONSTRUCTORES EN JAVA
INSTANCIAS Y CONSTRUCTORES EN JAVA
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
16 17 tecnologias python oop
16 17 tecnologias python oop16 17 tecnologias python oop
16 17 tecnologias python oop
 
3- Clases y Objetos
3- Clases y Objetos3- Clases y Objetos
3- Clases y Objetos
 
Fundamentos POO en JS. Mixins y Traits.
Fundamentos POO en JS. Mixins y Traits.Fundamentos POO en JS. Mixins y Traits.
Fundamentos POO en JS. Mixins y Traits.
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gio
 
Workshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operatorsWorkshop iOS 4: Closures, generics & operators
Workshop iOS 4: Closures, generics & operators
 

Similar a Serializacion (20)

Serializacion
SerializacionSerializacion
Serializacion
 
Serializacion
SerializacionSerializacion
Serializacion
 
Serializacion
SerializacionSerializacion
Serializacion
 
Serialización
 Serialización Serialización
Serialización
 
Serializacion
SerializacionSerializacion
Serializacion
 
(29 10-12)serializacion
(29 10-12)serializacion(29 10-12)serializacion
(29 10-12)serializacion
 
Suarez l 2001 el paquete java io
Suarez l 2001 el paquete java ioSuarez l 2001 el paquete java io
Suarez l 2001 el paquete java io
 
Serializacion de objetos
Serializacion de objetosSerializacion de objetos
Serializacion de objetos
 
Serializacion en java
Serializacion en javaSerializacion en java
Serializacion en java
 
Serializacion
SerializacionSerializacion
Serializacion
 
Serializacion de objetos
Serializacion de objetosSerializacion de objetos
Serializacion de objetos
 
Serialización personalizada
Serialización personalizadaSerialización personalizada
Serialización personalizada
 
Serializacion
SerializacionSerializacion
Serializacion
 
Java 5 se (presentación3)
Java 5 se (presentación3)Java 5 se (presentación3)
Java 5 se (presentación3)
 
Manejo de archivos en java
Manejo de archivos en javaManejo de archivos en java
Manejo de archivos en java
 
Manejo de archivos en java
Manejo de archivos en javaManejo de archivos en java
Manejo de archivos en java
 
Manejo+de+archivos+en+java
Manejo+de+archivos+en+javaManejo+de+archivos+en+java
Manejo+de+archivos+en+java
 
Manejo de archivos en java
Manejo de archivos en javaManejo de archivos en java
Manejo de archivos en java
 
Serializacion de objetos
Serializacion de objetosSerializacion de objetos
Serializacion de objetos
 
03 Oop
03   Oop03   Oop
03 Oop
 

Último

cuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básicacuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básicaGianninaValeskaContr
 
SIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docxSIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docxLudy Ventocilla Napanga
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas123yudy
 
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxPROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxEribertoPerezRamirez
 
libro para colorear de Peppa pig, ideal para educación inicial
libro para colorear de Peppa pig, ideal para educación iniciallibro para colorear de Peppa pig, ideal para educación inicial
libro para colorear de Peppa pig, ideal para educación inicialLorenaSanchez350426
 
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxSecuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxNataliaGonzalez619348
 
Fichas de Matemática DE SEGUNDO DE SECUNDARIA.pdf
Fichas de Matemática DE SEGUNDO DE SECUNDARIA.pdfFichas de Matemática DE SEGUNDO DE SECUNDARIA.pdf
Fichas de Matemática DE SEGUNDO DE SECUNDARIA.pdfssuser50d1252
 
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...fcastellanos3
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024gharce
 
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfFichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfssuser50d1252
 
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxRAMON EUSTAQUIO CARO BAYONA
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxYeseniaRivera50
 
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsxJuanpm27
 
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfDaniel Ángel Corral de la Mata, Ph.D.
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docxAgustinaNuez21
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialpatriciaines1993
 
Fichas de Matemática TERCERO DE SECUNDARIA.pdf
Fichas de Matemática TERCERO DE SECUNDARIA.pdfFichas de Matemática TERCERO DE SECUNDARIA.pdf
Fichas de Matemática TERCERO DE SECUNDARIA.pdfssuser50d1252
 
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docxEDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docxLuisAndersonPachasto
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfManuel Molina
 

Último (20)

cuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básicacuadernillo de lectoescritura para niños de básica
cuadernillo de lectoescritura para niños de básica
 
SIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docxSIMULACROS Y SIMULACIONES DE SISMO 2024.docx
SIMULACROS Y SIMULACIONES DE SISMO 2024.docx
 
periodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicasperiodico mural y sus partes y caracteristicas
periodico mural y sus partes y caracteristicas
 
TL/CNL – 2.ª FASE .
TL/CNL – 2.ª FASE                       .TL/CNL – 2.ª FASE                       .
TL/CNL – 2.ª FASE .
 
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docxPROGRAMACION ANUAL DE MATEMATICA 2024.docx
PROGRAMACION ANUAL DE MATEMATICA 2024.docx
 
libro para colorear de Peppa pig, ideal para educación inicial
libro para colorear de Peppa pig, ideal para educación iniciallibro para colorear de Peppa pig, ideal para educación inicial
libro para colorear de Peppa pig, ideal para educación inicial
 
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxSecuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
 
Fichas de Matemática DE SEGUNDO DE SECUNDARIA.pdf
Fichas de Matemática DE SEGUNDO DE SECUNDARIA.pdfFichas de Matemática DE SEGUNDO DE SECUNDARIA.pdf
Fichas de Matemática DE SEGUNDO DE SECUNDARIA.pdf
 
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
Estas son las escuelas y colegios que tendrán modalidad no presencial este lu...
 
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
SISTEMA INMUNE FISIOLOGIA MEDICA UNSL 2024
 
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfFichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
 
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
 
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptxPresentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
Presentación de Estrategias de Enseñanza-Aprendizaje Virtual.pptx
 
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
3. Pedagogía de la Educación: Como objeto de la didáctica.ppsx
 
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdfTema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
Tema 8.- Gestion de la imagen a traves de la comunicacion de crisis.pdf
 
CIENCIAS NATURALES 4 TO ambientes .docx
CIENCIAS NATURALES 4 TO  ambientes .docxCIENCIAS NATURALES 4 TO  ambientes .docx
CIENCIAS NATURALES 4 TO ambientes .docx
 
Día de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundialDía de la Madre Tierra-1.pdf día mundial
Día de la Madre Tierra-1.pdf día mundial
 
Fichas de Matemática TERCERO DE SECUNDARIA.pdf
Fichas de Matemática TERCERO DE SECUNDARIA.pdfFichas de Matemática TERCERO DE SECUNDARIA.pdf
Fichas de Matemática TERCERO DE SECUNDARIA.pdf
 
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docxEDUCACION FISICA 1°  PROGRAMACIÓN ANUAL 2023.docx
EDUCACION FISICA 1° PROGRAMACIÓN ANUAL 2023.docx
 
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdfTarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
Tarea 5_ Foro _Selección de herramientas digitales_Manuel.pdf
 

Serializacion

  • 1. Serialización de objetos 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. Ejemplo: public class MiFecha { protected int n; protected Date fecha; protected transient long s; . . . } En este ejemplo, los atributos n y fecha serán incluídos en la secuencia de bytes resultante de serializar un objeto de clase MiFecha. El atributo s no será incluído, por tener el modificador transient. 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. 1
  • 2. http://www.javahispano.com 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. Ejemplos Almacenamiento de objetos Es posible utilizar los mecanismos de serialización disponibles para serializar un objeto guardándolo en un fichero y para realizar el proceso inverso, recuperándolo desde el fichero. FileOutputStream fos = new FileOutputStream("fichero.bin"); FileInputStream fis = new FileInputStream("fichero.bin"); ObjectOutputStream out = new ObjectOutputStream(fos); ObjectInputStream in = new ObjectInputStream(fis); ClaseSerializable o1 = new ClaseSerializable(); ClaseSerializable o2 = new ClaseSerializable(); // Escribir el objeto en el fichero out.writeObject(o1); out.writeObject(o2); . . . // Leer el objeto del fichero (en el mismo orden !!) o1 = (ClaseSerializable)in.readObject(); o2 = (ClaseSerializable)in.readObject(); Envío de objetos por la red También es posible enviar un objeto serializado a través de la red. La diferencia consiste en que ahora se utilizan streams de distinto tipo. 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(); Serialización en RMI En RMI, la serialización se utiliza de forma casi transparente al usuario. Concretamente, se utiliza en el paso de parámetros y retorno de valores de las invocaciones a métodos de objetos remotos. Por ejemplo, cuando hacemos una invocación remota del tipo retorno obj.metodo(param); 2
  • 3. Serialización de objetos ocurre el siguiente proceso, de forma transparente al usuario: 1. (Local) El objeto param se serializa y se envía al objeto remoto como una secuencia de bytes 2. (Remoto) Se obtiene el objeto original a partir de la secuencia de bytes 3. (Remoto) Se ejecuta el método y se obtiene un valor de retorno 4. (Remoto) El valor de retorno se serializa y se envía como una secuencia de bytes 5. (Local) Se obtiene el retorno a partir de la secuencia de bytes Para que esta invocación se lleve a cabo, es necesario que tanto los parámetros de las invocaciones remotas como los valores devueltos pertenezcan a clases serializables. ´ Serialización personalizada En ocasiones puede interesar tomar el control sobre el proceso de serialización de una clase en concreto. Esto se puede hacer 'sobrecargando' los métodos writeObject y readObject de la clase cuya serialización se quiere controlar. En realidad, no se puede hablar de sobrecarga, puesto que estos métodos no están definidos en java.lang.Object. Este punto es un poco oscuro. Puede consultarse el API al respecto (método writeObject(Object) de ObjectOutputStream java.io.ObjectOutputStream y método readObject() de ObjectInputStream) y el JavaTutorial (Essential Java Classes -> Reading and Writing (but no 'rithmetic) -> Object Serialization -> Providing Object Serialization for Your Classes). Para 'personalizar' la serialización de un objeto, basta añadir un método tal que: private void writeObject (ObjectOutputStream stream) throws IOException { stream.defaultWriteObject(); . . . } Es necesario respetar exactamente tanto la signatura del método como la primera acción a realizar. A continuación pueden añadirse otras acciones que escriban en el stream dado. También será necesario añadir un método para hacer el paso inverso: private void readObject (ObjectInputStream stream) throws IOException { stream.defaultReadObject(); . . . } Aquí hay un ejemplo muy sencillo de uso de estos dos métodos. Con los println es posible comprobar que realmente se ejecutan cuando se produce la serialización y la reconstrucción de un objeto Prueba. Interfaz Externalizable 3
  • 4. http://www.javahispano.com Existe una interfaz en java.io llamada Externalizable que permite obtener un mayor control sobre el proceso de serialización y reconstrucción de nuestros objetos. Esta interfaz define dos métodos, writeExternal y readExternal, que se encargan de serializar y reconstruir un objeto, respectivamente. La serialización mediante Externalizable requiere de un mayor cuidado. De forma automática, sólo se guarda información relativa a la identidad de la clase del objeto que se está serializando. No se guarda automáticamente ni su estado ni información relativa a sus superclases. Por ello, en la implementación de writeExternal hay que guardar explícitamente el estado de aquellos atributos que nos interesen, incluídos los heredados. A la hora de implementar writeExternal y readExternal, se ha de tener muy en cuenta la serialización de las clases superiores en el grafo de herencia y coordinar la implementación de estos métodos con la de los mismos métodos en clases superiores. Emili Miedes es Ingeniero en Informática y trabaja de momento para el Instituto Tecnológico de Informática de la Universidad Politécnica de Valencia desarrollando en Java. Desarrollador opensource en sus ratos libres (buscar por emiedes en Sourceforge) anda buscando colaboración para acabar todo lo que empieza. Para cualquier duda o tirón de orejas, e-mail a: emiedes@iti.upv.es 4