Урок 15: Интерфейс Parcelable – 2 способа сериализации объектов
Оглавление:
Интерфейс Parcelable в Kotlin / Android
Parcelable, с другой стороны, является более эффективным инструментом, который разработан специально для Android. Он работает, создавая объект Parcelable, который может быть сохранен или передан в виде аргумента между компонентами приложения, используя методы writeParcelable и readParcelable. Это позволяет сериализовать объекты быстрее и более эффективно, чем Serializable, поскольку Parcelable не создает копию объекта в памяти и не требует такого количества ресурсов.
Способы реализации Parcelable
Теперь реализуем этот интерфейс, и здесь реализация будет разделена на 2 типа. С ручной реализацией методов Parcelable и с помощью дополнительной библиотеки.
Способ 1: с ручной реализацией методов Parcelable
Начнем со стандартного способа. Скопирую наш класс и закомментирую предыдущий пример, чтобы не отвлекал. Наследуемся от интерфейса Parcelable. Наводимся на ошибку и видим сообщение, что класс теперь обязан реализовать методы интерфейса.

Кроме того там идет речь про то, что класс ExtraWord реализует интерфейс Parcelable, но не предоставляет поле CREATOR.
Воспользуемся предложением AndroidStudio имплементировать необходимые методы прямо из всплывашки или же через контекстное меню. Добавляем оба.
Данный способ ручной реализацией методов интерфейса с одной стороны позволяет гибко настроить сериализацию и десериализацию. С другой стороны требует прям много кода от разработчика. Давайте вместе напишем все необходимое, чтобы если вы в своих рабочих или учебных проектах встретились с таким кодом – смогли в нем ориентироваться.
- Метод
describeContentsиспользуется для описания специфического содержимогоParcelable. Обычно возвращает0, если нет такого содержимого – это как значение по умолчанию. - Метод
writeToParcelсериализует объект, записывая его данные вParcelдля передачи. Для каждого свойства класса прописываем метод по его типу за исключением Boolean. В нем будем передавать 1 или 0 в зависимости от значения. - Далее нам понадобится конструктор для восстановления объекта из
Parcel, который содержит сериализованные данные. Обращаюсь к объекту и присваиваю свойствам класса полученные данные. И еще в моем случае нужно привести все к строке, чтобы убрать ошибку. - Наконец, обязательным действием при реализации интерфейса
Parcelableявляется добавление объектаCREATOR. Этот объект помогает системе Android восстанавливать ваш объект изParcel. После наследования от нужного нам класса получаем аналогичное уведомление о необходимости имплементировать 2 метода, необходимые для создания объектов из сериализованной формы. Сделаем это через контекстное меню. МетодcreateFromParcelотвечает за создание экземпляра класса ExtraWord из объектаParcel. Когда Android передает данные между компонентами, он преобразует их в Parcel, и этот метод восстанавливает объект. Здесь создается наш объектExtraWord, который принимаетParcelв качестве параметра конструктора. МетодnewArrayиспользуется для создания массива объектов класса ExtraWord. В данном случае будем возвращать массив, заполненныйnull. Метод используется, когда требуется массив объектов, например, для передачи нескольких объектов сразу.
Готово. Теперь как это работает все вместе:
- Здесь объект
wordсериализуется вParcelс помощью методаwriteToParcel()и добавляется вIntent. - В второй Activity система вызывает метод
createFromParcel()из объектаCREATOR, который восстанавливает объектExtraWordизParcel.
Вот и все, в целом, если пошагово разобраться все выглядит не так уж и страшно. Как и все программирование. Получилось довольно громоздко, но следующий способ вас приятно удивит.
Получение Parcelable объекта
Чтобы получить объект сделаем примерно все то же самое, скопирую и закомментирую предыдущую реализацию. Основное отличие в том, что из интента получаем данные с помощью метода getParcelableExtra. И второе это то, что приведение типа не сработает, поэтому уберу это и добавлю оператор null safety при обращении к объекту. Все остальное работает штатно, поэтому можно проверять. Переданное слово отображается успешно.
Способ 2: с помощью плагина kotlin-parcelize
Следующий способ использования Parcelable гораздо комфортнее в использовании, так как весь код, который мы вынуждены были имплементировать выше, будет сгенерирован под капотом с помощью плагина kotlin-parcelize.
Чтобы это сделать я скопирую класс, сохранив наследование интерфейса Parcelable. Но дополнительно к классу нужно добавить аннотацию @Parcelize. Как видите среда разработки не находит эту аннотацию – необходимо подключить плагин в градл файле. Перемещаемся туда.
Подключание плагина kotlin-parcelize
Я могу написать его напрямую. Плагин автоматически поставляется Kotlin плагином, поэтому здесь нам достаточно только его включить id("kotlin-parcelize") – и все заработает.
Возвращаемся в Активити и импортируем аннотацию в файл, нужно добавлять аннотацию именно из пакета kotlinx.parcelize. Отлично, ошибка ушла, во второй Активити ничего менять не нужно. Проверяем, что все работает также, как и задумано.
Способ хоть и требует дополнительного действия в виде подключения плагина, но выигрывает по производительности и в целом был создал специально под Android. Я бы рекомендовал его использовать в большинстве случаев.
Бесплатные Telegram-боты для обучения
Практика с проверкой кода и помощью ИИ-ментора
AndroidSprint AI Mentor
Проверяет Pull Request'ы в GitHub, проводит тестовые собеседования с голосом и таймером, помогает разбираться с кодом 24/7
Попробовать ИИ-ментора →KotlinSprint Bot
22 урока Kotlin, 220 тестов, 120 практических задач с код-ревью
Начать обучение Kotlin →