Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
Класс Java ObjectOutputStream
Класс ObjectOutputStream из пакета java.io позволяет записывать Java-объекты для последующего чтения через ObjectInputStream. Он расширяет OutputStream и является основой встроенного механизма сериализации Java.
Как работает ObjectOutputStream
При записи объекта в ObjectOutputStream фреймворк кодирует имя класса, значения полей и информацию о типах в бинарный формат — процесс, называемый сериализацией. Полученный байтовый поток можно сохранить в файл, передать по сети или разместить в памяти.
Важно: Только объекты, реализующие java.io.Serializable, могут быть сериализованы. Этот интерфейс-маркер сообщает среде выполнения, что объект безопасен для сохранения или передачи.
Создание ObjectOutputStream
Начните с импорта класса:
import java.io.ObjectOutputStream;
Затем свяжите его с FileOutputStream или любым другим OutputStream:
// Запись в файл "data.bin"
FileOutputStream fileStream = new FileOutputStream("data.bin");
ObjectOutputStream objStream = new ObjectOutputStream(fileStream);
Теперь objStream готов сериализовать объекты в fileStream.
Ключевые методы ObjectOutputStream
Класс наследует набор методов от OutputStream и добавляет специализированные для работы с объектами:
write(int b)— записывает один байт.writeBoolean(boolean v)— записывает boolean значение.writeChar(int v)— записывает символ.writeInt(int v)— записывает целое число.writeObject(Object obj)— сериализует данный объект.
Пример 1: Сериализация примитивов и строки
Полный фрагмент, записывающий int и String в файл, затем читающий их через ObjectInputStream:
import java.io.*;
public class Main {
public static void main(String[] args) {
int data1 = 5;
String data2 = "This is programiz";
try {
// Запись объектов
FileOutputStream fos = new FileOutputStream("file.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(data1);
oos.writeObject(data2);
oos.close();
// Чтение объектов
FileInputStream fis = new FileInputStream("file.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("Integer data :" + ois.readInt());
System.out.println("String data :" + ois.readObject());
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вывод
Integer data :5 String data :This is programiz
Пример 2: Сериализация пользовательского объекта
Для сериализации пользовательского класса достаточно реализовать Serializable:
import java.io.*;
class Dog implements Serializable {
String name;
String breed;
Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
}
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog("Tyson", "Labrador");
try {
// Запись объекта
FileOutputStream fos = new FileOutputStream("dog.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog1);
oos.close();
// Чтение объекта
FileInputStream fis = new FileInputStream("dog.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog newDog = (Dog) ois.readObject();
System.out.println("Dog Name: " + newDog.name);
System.out.println("Dog Breed: " + newDog.breed);
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вывод
Dog Name: Tyson Dog Breed: Labrador
Класс Dog должен реализовывать Serializable, так как ObjectOutputStream может писать только сериализуемые объекты.
Дополнительные операции ObjectOutputStream
| Метод | Описание |
|---|---|
flush() | Сбрасывает буферизованные выходные байты в базовый поток. |
drain() | Сбрасывает буферизованные данные (доступно в Java 9+). |
close() | Закрывает поток и освобождает системные ресурсы. |
Для глубокого изучения см. официальную документацию Java.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Наследование в Java: концепции, типы и практические примеры
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Мастерство Java ArrayList: операции, методы и лучшие практики
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление