Сериализация объектов в Java: сохранение и восстановление состояния
Сериализация — представление объекта как последовательности байтов, включающей данные объекта, информацию о его типе и типах полей. Сериализованный объект можно записать в файл, затем прочитать и десериализовать (восстановить в памяти). Процесс независим от JVM: можно сериализовать на одной платформе, десериализовать на другой.
Ключевые классы
ObjectOutputStream— методwriteObject(Object x)сериализует объект в выходной поток.ObjectInputStream— методreadObject()десериализует, возвращаетObject(нужен каст).
Условия сериализуемости
- Класс должен реализовывать
java.io.Serializable(маркерный интерфейс). - Все поля должны быть сериализуемыми. Нeseриализуемые поля помечаются
transient.
Пример: класс Employee
public class Employee implements java.io.Serializable {
public String name;
public String address;
public transient int SSN; // не сериализуется
public int number;
public void mailCheck() { System.out.println("Mailing check to " + name); }
}
Сериализация объекта
import java.io.*;
public class SerializeDemo {
public static void main(String[] args) {
Employee e = new Employee();
e.name = "Reyan Ali";
e.address = "Phokka Kuan, Ambehta Peer";
e.SSN = 11122333;
e.number = 101;
try (FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(e);
System.out.printf("Serialized data saved in /tmp/employee.ser");
} catch (IOException i) { i.printStackTrace(); }
}
}
Стандартное расширение файла: .ser.
Десериализация объекта
import java.io.*;
public class DeserializeDemo {
public static void main(String[] args) {
Employee e = null;
try (FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
e = (Employee) in.readObject();
} catch (IOException i) { i.printStackTrace(); return; }
catch (ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace(); return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN); // 0, так как transient
System.out.println("Number: " + e.number);
}
}
Результат:
Deserialized Employee...
Name: Reyan Ali
Address: Phokka Kuan, Ambehta Peer
SSN: 0
Number: 101
Важные моменты
ClassNotFoundException— если JVM не находит байт-код класса при десериализации.- Возвращаемое значение
readObject()нужно кастовать. - Поле
transientне сохраняется; при десериализации получает значение по умолчанию (0 для int).
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление
- Java: объекты, классы и основные концепции ООП