Ficheros (4/5). Flujos de bytes. Serialización de objetos.

SERIALIZACIÓN DE OBJETOS

·        Java nos permite guardar objetos en ficheros binarios (no sólo tipos de datos primitivos) mediante un mecanismo conocido como serialización.

·        La serialización de un objeto consiste en generar una secuencia de bytes lista para su almacenamiento o transmisión. Después, mediante la deserialización, se puede reconstruir el objeto.

·        Para que un objeto sea serializable, ha de implementar la interfaz java.io.Serializable (lo único que hace es marcar el objeto como serializable, sin que tengamos que implementar ningún método).

import java.io.Serializable;

 

public class Persona implements Serializable{

        private String nombre;

       private String telefono;

       private String email;

       private String nacimiento;

       

}

¡OJO, PROBLEMA! Al crear un fichero de objetos se crea una cabecera inicial con información y después se añaden los objetos. Si el fichero se utiliza posteriormente para añadir más registros se crea una nueva cabecera y se añaden los registros a partir de la nueva cabecera. Surgen problemas al leer el fichero, al encontrarse con la segunda cabecera (excepción StreamCorruptedException)

 

CAUSA: Se crea una cabecera cada vez que se crea un objeto ObjectOutputStream(file).

 

¡ATENCIÓN, SOLUCIÓN!

Se redefine la clase ObjectOutputStream  creando una nueva clase que la herede (extends). Dentro de ella se redefine el método writeStreamHeader() (es el que escribe las cabeceras) para que no haga nada.

 

Clase ObjectInputStream

·         Nos permite leer objetos serializables desde un stream.

·         Para crear un objeto:

File fich = new File(“Fichero.dat”);

// Creamos el flujo o stream de entrada

FileInputStream fichIn = new FileInputStream(fich);

// Conecta el flujo o stream de bytes al flujo de datos

ObjectInputStream dataIn = new ObjectInputStream(fichIn);

 

O bien:

File fich = new File(“Fichero.dat”);

ObjectInputStream dataIn = new ObjectInputStream(new FileInputStream(fich));

 

·         Métodos:

MÉTODO

DEVUELVEN OBJETOS DE TIPO

Object readObject()

Se utiliza para leer un objeto del ObjectInputStream.

Puede lanzar las excepciones IOException y ClassNotFoundException

 

Clase ObjectOutputStream

·         Nos permite escribir objetos serializables a un stream.

·         Métodos:

MÉTODO

DEVUELVEN OBJETOS DE TIPO

void writeObject(Object obj)

Se utiliza para escribir un objeto indicado en el ObjectOutputStream.

Puede lanzar la excepción IOException

 

Ejercicio 10

Realizar un programa en Java que escriba y lea en un fichero binario una serie de objetos. Los objetos serán de la clase persona que tendrá cuatro atributos de tipo String: nombre, apellido1, apellido2, nacimiento. Los datos de los objetos se tomaran de cuatro matrices con cinco datos cada una.

Ten en cuenta que:

-         Tienes que crear una clase Persona con los atributos indicados, constructores, métodos get y set…y que al ser la que se va a serializar (escribir como secuencia de bytes en un fichero) debe implementar la interface Serializable.

-         Crea otra clase llamada “SerializacionObjeto” con dos métodos uno llamado EscribirObjeto y otro LeerObjeto. Esta clase contendrá el método main.

-         Ten en cuenta el problema de las cabeceras cada vez que se crea un objeto de la clase ObjectOutputStream. Para resolverlo, crea sobre la clase ObjectOutputStream  una nueva y llámala MiObjectOutputStream. Esta clase debe redefinir su método writeStreamHeader para que si al serializar un objeto el fichero destino ya existiera, no se vuelva a escribir la cabecera.

-         En el método EscribirObjeto de la clase SerializacionObjeto, ten en cuenta si el fichero sobre el que se va a serializar existe o no para utilizar la clase ObjectOutputStream o MiObjectOutputStream.

 

 

 

Comentarios

Entradas populares de este blog

Ficheros (4/5). Flujos de bytes. Ejercicio 9

Ficheros (3/?). Flujos de caracteres. FileWriter, BufferedWrite, PrintWriter