Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre un mecanismo que nos provee Java llamado serializacion de objetos donde podemos representar a un objeto como una secuencia de bytes que incluye los datos del objeto como la informacion del tipo del objeto y los tipos de datos almacenados en el objeto.

Anuncios

Despues de serializado un objeto y escrito dentro de un archivo este puede ser leido y deserializado, el tipo de informacion, los bytes que representan al objeto y los datos almacenados pueden ser usados para recrear el objeto en memoria, lo mas llamativo de este proceso es que completamente independiente de la JVM, Java Virtual Machine, lo cual implica que podemos serializar un objeto en una plataforma y deserializar el objeto en otra plataforma, dos clases de este estilo son:

  • ObjectInputStream
  • ObjectOutputStream

Las cuales son streams de alto nivel con los metodos necesarios para poder serializar y deserializar un objeto.

Anuncios

La clase ObjectOutputStream contiene muchos metodos para escribir varios tipos de datos pero destacaremos el siguiente metodo:

public final void writeObject(Objeto x) throws IOException
Anuncios

Este metodo serializa un objeto y lo manda a un stream de salida y de forma similar la clase ObjectInputStream contiene el siguiente metodo para deserializar:

public final Objeto readObject() throws IOException, ClassNotFoundException
Anuncios

Este metodo recupera el proximo Objeto mas alla del stream y lo deserializa, el valor devuelto es un Objeto por lo que deberas convertirlo a su tipo adecuado, para serializar una clase correctamente debemos tener dos condiciones:

  • La clase debe poder implementar la interfaz java.io.Serializable
  • Todos los campos de la clase deben poder ser serializable y de no poder ser serializable debe ser marcado como transient
Anuncios

Una forma muy simple de saber si puede serializar o no, es implementando la interfaz y en caso afirmativo ser puede hacer de lo contrario no ahora hablemos como serializar un objeto a traves del siguiente ejemplo donde primero crearemos una clase en la cual implementaremos la serializacion:

EmpleadoSerial.java:

public class EmpleadoSerial implements java.io.Serializable
{
        public String nombre;
        public String direccion;
        public transient int DNI;
        public int numero;

        public void chequeCorreo()
        {
                System.out.println("Mandando cheque a " + nombre
                                        + " " + direccion);
        }
}
Anuncios

En este caso podemos ver como se implementa a Serializable, luego tendremos las variables para almacenar el nombre, la direccion, el DNI (al cual lo haremos transient) y por ultimo el numero de la direccion, despues tendremos un metodo el cual mostrara un mensaje donde notificara que se mando el cheque al empleado en la direccion indicada, con nuestra clase y la serializacion implementada procederemos a la clase base la cual ira en el siguiente ejemplo:

DemoSerializar.java:

import java.io.*;

public class DemoSerializar
{
        public static void main(String[] args)
        {
                EmpleadoSerial e = new EmpleadoSerial();
                e.nombre = "Martin Miranda";
                e.direccion = "Mercedes Sosa, Santa Monica";
                e.DNI = 29087695;
                e.numero = 333;

                try
                {
                        FileOutputStream archivo = new
                                        FileOutputStream("empleado.ser");
                        ObjectOutputStream salida = new
                                        ObjectOutputStream(archivo);
                        salida.writeObject(e);
                        salida.close();
                        archivo.close();
                        System.out.println("Datos guardados en empleado.ser");
                }
                catch (IOException i)
                {
                        i.printStackTrace();
                }
        }
}
Anuncios

En este programa importaremos todos los paquetes de java.io, luego en la clase crearemos un objeto llamado e de la clase creada anteriormente, EmpleadoSerial, donde le pasaremos el nombre, la direccion, el DNI y el numero de la direccion, despues utilizaremos un try / catch para ante cualquier eventualidad ver un mensaje de error, primero crearemos un objeto del tipo FileOutputStream el cual nos dara la capacidad de crear un archivo donde le indiquemos, la linea es esta:

FileOutputStream archivo = new FileOutputStream("empleado.ser");
Anuncios

La siguiente linea es la encargada de crear el objeto para la serializacion al cual llamaremos salida y nuestro stream de salida sera el archivo indicado justamente en archivo, despues procederemos a escribir en salida por medio de writeObject() y le enviaremos el objeto e que antes habiamos creado, para luego cerrar a salida y archivo, y poder escribir correctamente el archivo para finalmente mostrar una notificacion de que fue guardado el empleado, el catch se iniciara si aparece una excepcion de tipo IOException donde mostrara el volcado de la pila (stack), si lo compilamos y ejecutamos obtendremos la siguiente salida:

tinchicus@dbn001vrt:~/programacion/java/codigo$ java DemoSerializar
Datos guardados en empleado.ser
tinchicus@dbn001vrt:~/programacion/java/codigo$
Anuncios

Con esto si miramos nuestro archivo generado sera de la siguiente forma:

tinchicus@dbn001vrt:~/programacion/java/codigo$ cat empleado.ser
▒ercedes Sosa, Santa MonicatMartin Mirandatinchicus@dbn001vrt:~/programacion/java/codigo$ PuTTY
Anuncios

Como pueden ver se guardo como una secuencia de bytes y no en formato ASCII directamente, ahora procedamos a deserializar el archivo para obtener la informacion almacenada y para ello lo haremos a traves del siguiente ejemplo:

DemoDeserializar.java:

import java.io.*;

public class DemoDeserializar
{
        public static void main(String[] args)
        {
                EmpleadoSerial e = null;
                try
                {
                        FileInputStream archivo = new
                                        FileInputStream("empleado.ser");
                        ObjectInputStream entrada = new
                                        ObjectInputStream(archivo);
                        e = (EmpleadoSerial) entrada.readObject();
                        entrada.close();
                        archivo.close();
                }
                catch(IOException i)
                {
                        i.printStackTrace();
                        return;
                }
                catch(ClassNotFoundException c)
                {
                        System.out.println("Clase EmpleadoSerial no encontrada");
                        c.printStackTrace();
                        return;
                }

                System.out.println("Deserializando al empleado...");
                System.out.println("Nombre: " + e.nombre);
                System.out.println("Direccion: " + e.direccion);
                System.out.println("DNI: " + e.DNI);
                System.out.println("Numero: " + e.numero);
        }
}
Anuncios

En este ejemplo primero vamos a crear un objeto de EmpleadoSerial llamado e, nuestro siguiente paso sera crear un objeto llamado archivo de la clase FileInputStream, que al igual que antes nos permitira acceder a un archivo pero esta vez para lectura y le diremos cual es nuestro archivo, nuestra siguiente linea sera la encargada de crear el stream de entrada el cual sera direccionado a nuestro archivo, nuestro siguiente paso sera leer el contenido del archivo por medio de readObject() y todo ese contenido lo deserializara y lo asignara a nuestro objeto e, despues cerramos nuestros dos streams, archivo y salida, para ir redondeando los catch estan para si ocurre alguna de las dos excepcions, IOException y ClassNotFoundException, donde nos mostrara una notificacion, por ultimo mostraremos el contenido de nuestro empleado por medio de las variables instanciadas del objeto, compilemos y probemos para ver si funciona correctamente:

tinchicus@dbn001vrt:~/programacion/java/codigo$ java DemoDeserializar
Deserializando al empleado…
Nombre: Martin Miranda
Direccion: Mercedes Sosa, Santa Monica
DNI: 0
Numero: 333
tinchicus@dbn001vrt:~/programacion/java/codigo$
Anuncios

Como podemos ver funciono perfectamente salvo por el DNI, esto es debido a que usamos la palabra transient y esto hizo que al momento de serializar a nuestro empleado este dato fuera ignorado por esto no lo recuperamos pero por el resto funciono correctamente, si quieren prueben de quitar la palabra transient de la clase EmpleadoSerial, compilenlo nuevamente, vuelvan a crear al empleado y veamos como es la salida de nuestro programa:

tinchicus@dbn001vrt:~/programacion/java/codigo$ java DemoDeserializar
Deserializando al empleado…
Nombre: Martin Miranda
Direccion: Mercedes Sosa, Santa Monica
DNI: 29087695
Numero: 333
tinchicus@dbn001vrt:~/programacion/java/codigo$

Y en este caso vemos como si nos trajo el documento dado que ahora no lo ignora.

Anuncios

En resumen, hoy hemos visto que es la serializacion, que ventajas tiene, como se puede utilizar, como guardar informacion y como leer informacion, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00