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
Publicar un comentario