Перейти к содержимому
На этой странице

Контроль сериализации

Все темы Java Developer

Что обозначает ключевое слово transient?

transient исключает поле экземпляра из стандартной сериализованной формы. При обычной десериализации такое поле получает значение по умолчанию, если пользовательский readObject не восстанавливает его отдельно. Пример ниже демонстрирует явную запись transient-поля; это не защита данных.

Пример:
import java.io.*;

public class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private transient String note; // не будет сериализовано стандартным способом

    public Person(String name, int age, String note) {
        this.name = name;
        this.age = age;
        this.note = note;
    }

    private void writeObject(ObjectOutputStream oos) throws IOException {
        oos.defaultWriteObject(); // стандартная сериализация
        oos.writeObject(encodeDemo(note)); // дополнительная логика (учебное преобразование строки)
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.defaultReadObject(); // стандартная десериализация
        note = decodeDemo((String) ois.readObject()); // дополнительная логика (обратное учебное преобразование строки)
    }

    private String encodeDemo(String data) {
        return new StringBuilder(data).reverse().toString(); // обратимое преобразование, не шифрование
    }

    private String decodeDemo(String data) {
        return new StringBuilder(data).reverse().toString(); // обратное преобразование
    }
}

Как не допустить сериализацию?

Чтобы не допустить сериализацию класса в Java, можно использовать несколько подходов:

  1. Не реализовывать интерфейс Serializable : Самый простой способ — не реализовывать интерфейс Serializable в классе. Если класс не реализует этот интерфейс, попытки сериализовать его объекты приведут к выбросу исключения NotSerializableException.

  2. Использовать transient для полей: Помечать поля как transient, если они не должны быть сериализованы. Это подход применим для отдельных полей, а не для всего класса.

  3. Имплементировать writeObject и readObject методы с исключением: Можно определить методы writeObject и readObject в классе, которые будут выбрасывать исключение, предотвращая таким образом сериализацию.

Пример:
import java.io.*;

public class NonSerializableClass implements Serializable {
    private static final long serialVersionUID = 1L;
    private String data;

    public NonSerializableClass(String data) {
        this.data = data;
    }

    private void writeObject(ObjectOutputStream oos) throws IOException {
        throw new NotSerializableException("Serialization is not allowed for this class");
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        throw new NotSerializableException("Deserialization is not allowed for this class");
    }

    // геттеры и сеттеры
}

В этом примере попытки сериализовать или десериализовать объекты класса NonSerializableClass будут выбрасывать исключение NotSerializableException.

Собеседования: Java

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: Java-разработчик, Backend-разработчик на Java. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.