ObjectOutputStream en Java: escribir un objeto en un archivo

ObjectOutputStream en Java se puede utilizar para convertir un objeto a OutputStream. El proceso de convertir un objeto a flujo se llama serialización en Java. Una vez que un objeto se convierte en OutputStream, se puede guardar en un archivo o base de datos, enviar a través de la red o utilizar en conexiones de sockets. Por lo tanto, podemos usar FileOutputStream para escribir un objeto en un archivo.

ObjectOutputStream

ObjectOutputStream es parte de las clases de Java IO y su único propósito es proporcionarnos una forma de convertir un objeto Java en un flujo. Cuando creamos una instancia de ObjectOutputStream, debemos proporcionar el OutputStream que se va a utilizar. Este OutputStream es utilizado por ObjectOutputStream para canalizar el flujo de objetos al flujo de salida subyacente, por ejemplo, FileOutputStream.

Requisitos de ObjectOutputStream

El objeto que queremos serializar debe implementar la interfaz java.io.Serializable. Serializable es solo una interfaz de marcador y no tiene ningún método abstracto que tengamos que implementar. Obtendremos java.io.NotSerializableException si la clase no implementa la interfaz Serializable. Algo así como la traza de la pila de excepciones a continuación.

java.io.NotSerializableException: com.journaldev.files.EmployeeObject
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at com.journaldev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)

Ejemplo de Java ObjectOutputStream para escribir un objeto en un archivo

Veamos un ejemplo de Java ObjectOutputStream para escribir un objeto en un archivo. Para eso, en primer lugar, deberíamos tener una clase con algunas propiedades. Creemos un objeto que guardaremos en el archivo.

package com.journaldev.files;

import java.io.Serializable;

public class Employee implements Serializable {

	private static final long serialVersionUID = -299482035708790407L;

	private String name;
	private String gender;
	private int age;

	private String role;
	// private transient String role;

	public Employee(String n) {
		this.name = n;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getRole() {
		return role;
	}

	public void setRole(String role) {
		this.role = role;
	}

	@Override
	public String toString() {
		return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role;
	}

}

Observa que no es un requisito tener getter/setter para todas las propiedades. O tener un constructor sin argumentos. Como puedes ver, el objeto Employee anterior no tiene métodos getter/setter para la propiedad “nombre”. Tampoco tiene un constructor sin argumentos. Aquí está el programa que muestra cómo escribir un objeto en un archivo en Java usando ObjectOutputStream.

package com.journaldev.files;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamExample {

	public static void main(String[] args) {
		Employee emp = new Employee("Pankaj");

		emp.setAge(35);
		emp.setGender("Male");
		emp.setRole("CEO");
		System.out.println(emp);
		
		try {
			FileOutputStream fos = new FileOutputStream("EmployeeObject.ser");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			// escribir objeto en archivo
			oos.writeObject(emp);
			System.out.println("Done");
			// cerrar recursos
			oos.close();
			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

A continuación se muestra la salida del programa anterior. Si te estás preguntando cuál es el contenido del archivo EmployeeObject.ser, está un poco confuso y algo así como lo siguiente.

��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO

ObjectOutputStream con un transient

Si no queremos que alguna propiedad del objeto se convierta en flujo, tenemos que usar la palabra clave transient para eso. Por ejemplo, simplemente cambia la propiedad de rol como se muestra a continuación y no se guardará.

private transient String role;

ObjectOutputStream y serialVersionUID

¿Notaste el serialVersionUID definido en el objeto Employee? Es utilizado por las clases ObjectOutputStream y ObjectInputStream para operaciones de escritura y lectura de objetos. Aunque no es obligatorio tener este campo, deberías mantenerlo. De lo contrario, cada vez que cambies tu clase, no tendrá efecto en los objetos serializados anteriormente y comenzará a fallar. Para un análisis detallado, ve a Serialización en Java. Si te estás preguntando si nuestro programa funcionó bien o no, utiliza el siguiente código para leer un objeto del archivo guardado.

FileInputStream is = new FileInputStream("EmployeeObject.ser");
ObjectInputStream ois = new ObjectInputStream(is);
Employee emp = (Employee) ois.readObject();

ois.close();
is.close();
System.out.println(emp.toString());
//La salida será "Empleado:: Nombre=Pankaj Edad=35 Género=Masculino Rol=CEO"

Esto es todo sobre java ObjectOutputStream y cómo usarlo para escribir el objeto en un archivo.

Puedes consultar más ejemplos de Java IO en nuestro Repositorio de GitHub.

Referencia: Documentación de la API

Source:
https://www.digitalocean.com/community/tutorials/objectoutputstream-java-write-object-file