Что такое передача в поток в Serializable

Ответ

Serializable — это интерфейс-маркер в Java, позволяющий объектам сериализоваться (превращаться в поток байтов) для передачи между процессами или сохранения.

Особенности:

  • Простая реализация (достаточно имплементировать интерфейс).
  • Автоматическая сериализация всех не-static и не-transient полей.
  • Медленнее Parcelable из-за рефлексии и создания лишних объектов.

Пример:

public class User implements Serializable {
    private String name;
    private transient int age; // Не будет сериализовано
}

Проблемы:

  • Нет контроля над процессом сериализации (может привести к ошибкам при изменении класса).
  • Версионность требует ручного управления (serialVersionUID).

Используйте для простых сценариев, но предпочитайте Parcelable для Android.

Ответ 18+ 🔞

Ага, слушай, вот эта ваша Serializable — ну такая классика, прям как дедовский «Москвич»: вроде едет, но жрёт бензина дохуя и ломается на ровном месте. По сути, это просто бумажка «разрешаю», которую ты на свой класс клеишь. Написал implements Serializable — и всё, объект уже готов в байтики превращаться, чтобы его по сети швырнуть или на диск записать.

Нюансы, которые вгоняют в тоску:

  • Реализовать — проще некуда, один хук впилил и вроде работает. Прям как в детском конструкторе.
  • Но он, сука, автоматом тащит в этот поток байтов ВСЁ, что не static и не transient. Всё! Даже если тебе это нахуй не нужно. Представь, ты везешь на дачу один стул, а грузчики зачем-то весь диван впихивают в газель — вот это оно и есть.
  • Скорость? Да хуйня полная. Там под капотом рефлексия работает, объекты лишние плодятся — в общем, тормозит знатно.

Вот, смотри, как выглядит:

public class User implements Serializable {
    private String name;
    private transient int age; // А вот это умные поля — их не повезём, как будто забыли дома
}

А теперь про подводные ебеня:

  • Контроля ноль, блядь. Всё происходит магически. Изменил чуть класс — и всё, привет, InvalidClassException. Объекты старые читать не может, новые — тоже нихуя. Удивление пиздец, когда в продакшене такое вылезает.
  • Версионность — это отдельная песня. Надо вручную эту константу serialVersionUID прописывать, а если забудешь — считай, накрылся медным тазом. Система сама её сгенерит по сигнатуре класса, и при малейшем чихе она изменится, и твоя десериализация нахуй сломается.

Короче, юзать можно, если пишешь какую-нибудь простыню для себя и не паришься. Но если дело на Android, где каждый миллисекунд и каждый байт на счету — тут уже надо Parcelable брать. Это как пересесть с «Москвича» на нормальный автомобиль: больше кода написать, зато летает. А Serializable — он для ленивых, но потом за эту лень приходится расплачиваться. Сам от себя охуеешь, когда начнёт глючить.