Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
Clase ObjectOutputStream de Java
Explora la API de ObjectOutputStream de Java, sus métodos principales y ejemplos paso a paso que demuestran cómo serializar objetos a archivos y leerlos de vuelta.
La clase ObjectOutputStream del paquete java.io te permite escribir objetos de Java para que puedan ser leídos después por ObjectInputStream. Extiende OutputStream y es la base del mecanismo de serialización integrado de Java.
Cómo Funciona ObjectOutputStream
Cuando escribes un objeto en un ObjectOutputStream, el framework codifica el nombre de la clase del objeto, valores de campos e información de tipo en un formato binario—un proceso conocido como serialización. El flujo de bytes resultante puede almacenarse en un archivo, transmitirse por red o incluso incrustarse en memoria.
Importante: Solo los objetos que implementan java.io.Serializable pueden ser serializados. Esta interfaz actúa como un marcador para informar al runtime que un objeto es seguro para persistir o transmitir.
Crear un ObjectOutputStream
Comienza importando la clase:
import java.io.ObjectOutputStream;
Luego, vínculo a un FileOutputStream o cualquier otro OutputStream subyacente:
// Escribir en un archivo llamado "datos.bin"
FileOutputStream flujoArchivo = new FileOutputStream("datos.bin");
ObjectOutputStream flujoObj = new ObjectOutputStream(flujoArchivo);
Aquí, flujoObj está listo para serializar objetos en flujoArchivo.
Métodos Principales de ObjectOutputStream
La clase hereda un conjunto de métodos de OutputStream y añade otros especializados para manejo de objetos:
write(int b)– escribe un solo byte.writeBoolean(boolean v)– escribe un valor booleano.writeChar(int v)– escribe un carácter.writeInt(int v)– escribe un entero.writeObject(Object obj)– serializa el objeto dado.
Ejemplo 1: Serializando Datos Primitivos y String
A continuación se muestra un fragmento completo que escribe un int y un String en un archivo, luego los lee de vuelta usando ObjectInputStream:
import java.io.*;
public class Main {
public static void main(String[] args) {
int dato1 = 5;
String dato2 = "Esto es programiz";
try {
// Escribir objetos
FileOutputStream fos = new FileOutputStream("archivo.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(dato1);
oos.writeObject(dato2);
oos.close();
// Leer objetos
FileInputStream fis = new FileInputStream("archivo.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("Dato entero: " + ois.readInt());
System.out.println("Dato cadena: " + ois.readObject());
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Salida
Dato entero: 5 Dato cadena: Esto es programiz
Ejemplo 2: Serializando un Objeto Personalizado
Para serializar una clase definida por el usuario, simplemente implementa Serializable:
import java.io.*;
class Perro implements Serializable {
String nombre;
String raza;
Perro(String nombre, String raza) {
this.nombre = nombre;
this.raza = raza;
}
}
public class Main {
public static void main(String[] args) {
Perro perro1 = new Perro("Tyson", "Labrador");
try {
// Escribir el objeto
FileOutputStream fos = new FileOutputStream("perro.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(perro1);
oos.close();
// Leer el objeto
FileInputStream fis = new FileInputStream("perro.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Perro nuevoPerro = (Perro) ois.readObject();
System.out.println("Nombre del Perro: " + nuevoPerro.nombre);
System.out.println("Raza del Perro: " + nuevoPerro.raza);
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Salida
Nombre del Perro: Tyson Raza del Perro: Labrador
La clase Perro debe implementar Serializable porque ObjectOutputStream solo puede escribir objetos serializables.
Operaciones Adicionales de ObjectOutputStream
| Método | Descripción |
|---|---|
flush() | Vacía cualquier byte de salida en búfer al flujo subyacente. |
drain() | Vacía datos en búfer (disponible en Java 9+). |
close() | Cierra el flujo y libera cualquier recurso del sistema. |
Para una inmersión más profunda, consulta la documentación oficial de Java.
Java
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando ArrayList en Java: Operaciones, métodos y mejores prácticas
- Clase Stack de Java: Guía Completa de Uso y Métodos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación