В чем разница между Serializable и Parcelable
Что проверяют
Понимаете ли вы, почему в Android есть свой механизм передачи объектов, и знаете ли современный способ его использовать.
Как отвечать
Serializable это стандартный механизм Java: интерфейс-маркер, всё остальное делает рефлексия. Писать код не нужно, но за это платится скоростью и мусором в памяти, потому что рефлексия создаёт много временных объектов.
Parcelable это механизм Android: объект сам описывает, как разложить себя в Parcel и собрать обратно. Рефлексии нет, отсюда заметно выше скорость, что важно, потому что через Parcel данные ходят между процессами при каждом запуске экрана и восстановлении состояния.
Что стоит добавить, чтобы ответ звучал современно:
- в Kotlin ручной код больше не пишут: аннотация
@Parcelizeиз плагинаkotlin-parcelizeгенерирует его сама; Parcelне предназначен для долгого хранения: формат может измениться между версиями системы, поэтому в файл или в базу так сохранять нельзя, только передавать между компонентами;- есть жёсткое ограничение на размер транзакции (около мегабайта на процесс), и попытка передать большой список приводит к
TransactionTooLargeException. Правильный ответ на это не оптимизация сериализации, а передача идентификатора вместо данных; - современный подход к состоянию экрана это
SavedStateHandleи передача идентификаторов аргументами навигации, а тяжёлые объекты живут в слое данных.
@Parcelize
data class JobFilter(val query: String, val remoteOnly: Boolean) : ParcelableГде спотыкаются
Считают разницу чисто теоретической. На списках объектов она измеряется в разы, и это видно на открытии экрана.
Передают между экранами весь объект вакансии вместе с описанием и падают на большом тексте.
Забывают, что Serializable тянет за собой сериализацию всех вложенных полей, включая те, что не собирались передавать.