viernes, 19 de febrero de 2010

Guardar un objeto en java

En java hacer este tipo de cosas es tremendamente fácil y rápido, basta con implementar a una clase la interfaz Serializable.
Con esa interfaz conseguimos que con solo llamar al método writeObject nuestro objeto se serializa lo que permite mandar el objeto por red o guardarlo en un fichero como en este caso. Para recuperar un objeto serializado basta con utilizar el método readObject.
Cuando exista un atributo estático tendremos que guardarlo manualmente, pero igualmente es fácil, seria algo tal que así:

// guardar
private void writeObject(ObjectOutputStream stream) throws IOException{
//serializa el objeto como siempre (todos los atributos menos los estaticos)
stream.defaultWriteObject();
//ahora el atributo estático
stream.write(atributoEstatico);
}

// leer objeto
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException{
stream.defaultReadObject();
atributoEstatico= stream.read();
}


//ahora el ejemplo para guardar los objetos en un fichero
public boolean save(Objeto obj){
try {
//fichero en el que se guardará el objeto
FileOutputStream file=new FileOutputStream("prueba");
//canal de salida del fichero
ObjectOutputStream os;
os = new ObjectOutputStream(file);
//escribimos el objeto en el fichero
os.writeObject(obj);
//cerramos el canal de salida y el fichero
os.close();
file.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}

return true;
}

//Metodo para cargar el objeto anteriormente guardado
public Objeto load(){
Objeto obj;
try {
FileInputStream fis = new FileInputStream("prueba");
ObjectInputStream ois = new ObjectInputStream (fis);

obj =(Objeto) ois.readObject();

ois.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}

return obj;
}


PD: tened en cuenta que también se pueden serializar listas, arrays etc. que contengan objetos que implementen la interfaz Serializable.

4 comentarios:

Edmond dijo...

Esto está que arde, tengo que probarlo !
Saludos excelente WEB sigan así !!!

Francisco García Díaz dijo...

Gracias, espero que sigamos activos mucho mas tiempo :D

Anónimo dijo...

Buena explicacion..
Tengo un problema, intento guardar un objeto dando una direccion mas el nombre del archivo,y no funciona sera que se puede hacer esto de otra forma???

Agradeceria tu ayuda

Atte Leandra

jesusnoseq dijo...

Pues no se lo que falla pero la idea es esa. A mi me funcina sin problemas así:

FileOutputStream file=new FileOutputStream("directorio/fichero");


La barra para rutas es / siempre en java, cuidado.
Si sigues con el problema pon un comentario con el codigo a ver...