---
title: Контроль сериализации
seo:
  title: Контроль сериализации — Java Developer
  description: Тема «Контроль сериализации» для собеседования Java Developer. Что обозначает ключевое слово transient? Как не допустить сериализацию?
---

[Все темы Java Developer](/java-developer)

## <strong>Что обозначает ключевое слово</strong> <code>transient</code><strong>?</strong> [#q-14bee738d69b81c485d4d085532c89c7]

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

<strong>Пример&#58;</strong>

```java
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(); // обратное преобразование
    }
}
```

:::note[Ссылки для изучения]

1. [Сериализация в Java](https://javarush.com/groups/posts/2022-serializacija-i-deserializacija-v-java)
   :::

---

## <strong>Как не допустить сериализацию?</strong> [#q-14bee738d69b8154bc07d74ac778ec02]

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

1. <strong>Не реализовывать интерфейс</strong> <code>Serializable</code>
   <strong>&#58;</strong> Самый простой способ — не реализовывать интерфейс
   <code>Serializable</code> в классе. Если класс не реализует этот интерфейс,
   попытки сериализовать его объекты приведут к выбросу исключения
   <code>NotSerializableException</code>.

1. <strong>Использовать</strong> <code>transient</code>
   <strong>для полей&#58;</strong> Помечать поля как <code>transient</code>,
   если они не должны быть сериализованы. Это подход применим для отдельных
   полей, а не для всего класса.

1. <strong>Имплементировать</strong> <code>writeObject</code> <strong>и</strong>
   <code>readObject</code> <strong>методы с исключением&#58;</strong> Можно
   определить методы <code>writeObject</code> и <code>readObject</code> в
   классе, которые будут выбрасывать исключение, предотвращая таким образом
   сериализацию.

<strong>Пример&#58;</strong>

```java
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");
    }

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

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

:::note[Ссылки для изучения]

1. [Сериализация в Java](https://javarush.com/groups/posts/2022-serializacija-i-deserializacija-v-java)
   :::
