Что такое сериализация объектов и для чего она применяется?

«Что такое сериализация объектов и для чего она применяется?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сериализация — это процесс преобразования объекта в последовательность байтов для хранения или передачи. Обратный процесс — десериализация.

Основные сценарии использования:

  1. Сохранение состояния: Запись объекта в файл или базу данных.
  2. Сетевое взаимодействие: Передача объектов между приложениями (RPC, REST API, сообщения).
  3. Кэширование: Хранение объектов в сериализованном виде (например, в Redis).
  4. Распределенные системы: Обмен данными между процессами или машинами.

Пример сериализации в Java с Serializable:

import java.io.*;

class User implements Serializable {
    // Контроль версий для совместимости
    private static final long serialVersionUID = 1L;

    private String name;
    private transient String password; // transient — не сериализуется

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{name='" + name + "', password='" + password + "'}";
    }
}

public class SerializationDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User original = new User("Alice", "secret123");

        // Сериализация в файл
        try (ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream("user.dat"))) {
            oos.writeObject(original);
        }

        // Десериализация из файла
        try (ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream("user.dat"))) {
            User restored = (User) ois.readObject();
            System.out.println(restored);
            // User{name='Alice', password='null'} (password был transient)
        }
    }
}

Важные аспекты:

  • Serializable — маркерный интерфейс в Java.
  • transient — исключает поле из сериализации.
  • serialVersionUID — обеспечивает совместимость версий класса.
  • Альтернативы: JSON (Jackson, Gson), XML, Protocol Buffers — более гибкие и языково-независимые форматы.