JavaRush /Курсы /Java Core /Модификатор transient

Модификатор transient

Java Core
10 уровень , 5 лекция
Открыта

— Привет, Амиго! Хотела тебе порассказывать одно маленькое дополнение к сериализации.

Допустим наш класс содержит ссылку на какой-нибудь InputStream, тогда его нельзя сериализовать, ведь так?

— Да. Ты же сама говорила, что потоки сериализовать нельзя. А сериализовать объект, у которого есть несериализуемые данные – тоже нельзя.

— Да. Именно так. Но что, если класс хранит данные, которые не играют значащей роли в его состоянии, но мешают считаться ему сериализуемым классом? Мало ли что класс может у себя хранить ненужного. Возможно, он может выбросить эти данные в любой момент или даже так и делает постоянно.

Для таких случаев разработчики Java придумали специальное слово – transient. Его можно написать перед переменной класса и она не будет учитываться при сериализации. Ее состояние не будет ни сохраняться, ни восстанавливаться. Как будто и нет ее вовсе. Как раз для таких ситуаций, как мы только что рассмотрели.

Помнишь кеширование и модификатор volatileНет правил без исключений.

Вот тебе один примерчик такого счастья:

Пример «кота» с невидимой для сериализации переменной — in:

Код
class Cat implements Serializable {
    public String name;
    public int age;
    public int weight;

 transient public InputStream in = System.in; 
}
Комментарии (104)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 33
17 сентября 2025
like
Никита QA Уровень 34
14 мая 2025
Информативно, идем дальше)
10 апреля 2025
чем дальше, тем смешнее.
{Java_Shark} Уровень 36
16 декабря 2024
++
Денис Кокшаров Уровень 32
24 марта 2025
++Java_Shark
{Java_Shark} Уровень 36
16 декабря 2024
++
Денис Кокшаров Уровень 32
24 марта 2025
++Java_Shark
G L Уровень 38
25 ноября 2024
Я так понял это сейчас все устарело и не используется на практике Что используют вместо встроенной сериализации? Современные системы предпочитают использовать другие форматы для сериализации и десериализации данных: 1. JSON (JavaScript Object Notation) Простой и широко поддерживаемый формат. Используется для передачи данных между сервисами, особенно в веб-приложениях (REST API). Поддерживается библиотеками вроде Jackson и Gson. 2. Protocol Buffers (Protobuf) Разработан Google для эффективной сериализации данных. Более производительный и компактный, чем JSON или XML. Требует описания структуры данных в .proto файлах. 3. Apache Avro Популярный формат в системах Big Data, таких как Apache Kafka. Отличается встроенной поддержкой схем, что делает его удобным для работы с изменениями структуры данных. 4. XML (Extensible Markup Language) Используется в системах, где требуется человеко-читаемый формат данных. Хотя он менее популярен в современных приложениях, все еще встречается в корпоративных системах. 5. Thrift (от Apache) Разработан Facebook, как аналог Protobuf, с поддержкой нескольких языков программирования. 6. YAML (Yet Another Markup Language) Более читабельный формат, чем JSON, но используется реже из-за меньшей эффективности. 7. CBOR (Concise Binary Object Representation) и MessagePack Легковесные двоичные форматы, эффективные и компактные.
Anonymous #3477481 Уровень 38
29 октября 2024
Как я понял, упоминание volatile чисто для сравнения. Как переменные, помеченные volatile, не кэшируются (сохраняются) в кэш процессора (принудительно записываются в основную память), так и переменные, помеченные transient, не сериализуются (сохраняются) при сериализации. Думаю, это единственная взаимосвязь этих модификаторов.
Василий Куртев Уровень 33
29 сентября 2024
настолько лениво все написано, платишь деньги, шоб потом самому гуглить, вкусно
Nazadain Уровень 39
11 ноября 2024
Да тут вроде нечего добавить особо. Достаточно простая и понятная тема.
Денис Кокшаров Уровень 32
24 марта 2025
и более того, работа программиста и заключается в том, чтобы гуглить самостоятельно
Максим Li Уровень 40
11 мая 2024
11.05.2024
Dmitry Shaburov Уровень 33
17 ноября 2023
17/11/2023