Урок 15: Интерфейс Parcelable – 2 способа сериализации объектов

Урок 15: Интерфейс Parcelable – 2 способа сериализации объектов

Интерфейс Parcelable в Kotlin / Android

Parcelable, с другой стороны, является более эффективным инструментом, который разработан специально для Android. Он работает, создавая объект Parcelable, который может быть сохранен или передан в виде аргумента между компонентами приложения, используя методы writeParcelable и readParcelable. Это позволяет сериализовать объекты быстрее и более эффективно, чем Serializable, поскольку Parcelable не создает копию объекта в памяти и не требует такого количества ресурсов.

Способы реализации Parcelable

Теперь реализуем этот интерфейс, и здесь реализация будет разделена на 2 типа. С ручной реализацией методов Parcelable и с помощью дополнительной библиотеки.

Способ 1: с ручной реализацией методов Parcelable

Начнем со стандартного способа. Скопирую наш класс и закомментирую предыдущий пример, чтобы не отвлекал. Наследуемся от интерфейса Parcelable. Наводимся на ошибку и видим сообщение, что класс теперь обязан реализовать методы интерфейса.

Снимок экрана 2024-11-19 в 13.00.01.png

Кроме того там идет речь про то, что класс 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 →

AndroidSprint Bot

Тесты по Android SDK, Jetpack Compose, архитектуре приложений

Тесты по Android →

Бесплатная диагностика с сениор разработчиком

Запишитесь на консультацию — перезвоним в рабочие часы

Или свяжитесь удобным способом

Вам также может быть интересно

Узнать подробнее
Курс AndroidSprint

Глубокое обучение Android разработке с 0 до получения оффера. Только персональная практика с гарантией получения продуктового опыта.

Курс AndroidSprint - Глубокое <strong>обучение Android разработке с 0 до получения оффера</strong>. Только персональная практика с гарантией получения продуктового опыта.
Узнать подробнее
Узнать подробнее
Практикум по Kotlin

Изучение Котлин с 0 для профессиональной разработки. Личный ментор и разбор кода задач через git-flow.

Практикум по Kotlin - Изучение Котлин <strong>с 0 для профессиональной разработки</strong>. Личный ментор и разбор кода задач через git-flow.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Kotlin разработке

Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.

Бесплатные уроки по Kotlin разработке - <span>Самостоятельное освоение базы по языку для дальнейшего развития в Android/back-end разработке или в автотестах.</span>
Узнать подробнее
Узнать подробнее
Onboarding в разработку

Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь

Onboarding в разработку - <span>Полное обучение Android разработке с нуля до получения оффера. Делаем упор на практику и обратную связь</span>
Узнать подробнее
Узнать подробнее
Обучающий Kotlin телеграм бот (с тестами)

Ваш основной инструмент для изучения основ языка. Бесплатные тесты и практика внутри.

Обучающий Kotlin телеграм бот (с тестами) - Ваш основной <span>инструмент для изучения основ языка.</span> Бесплатные тесты и практика внутри.
Узнать подробнее
Узнать подробнее
Бесплатные уроки по Android разработке

Самостоятельное обучение разработке Андроид приложений. Понятные видеоуроки с разжеванными примерами.

Бесплатные уроки  по Android разработке - Самостоятельное <span>обучение разработке Андроид приложений.</span> Понятные видеоуроки с разжеванными примерами.
Узнать подробнее
Узнать подробнее
Курс по UI/Unit тестированию

Для ручных тестировщиков, которые готовы осваивать автотесты с использованием актуального стека технологий. [в разработке]

Курс по UI/Unit тестированию - Для ручных тестировщиков, которые <span>готовы осваивать автотесты</span> с использованием актуального стека технологий. [в разработке]
Узнать подробнее
Узнать подробнее
Обучающий Android телеграм бот (с тестами)

Бесплатные теоретические тесты для самопроверки. А также информер на практических спринтах по Android.

Обучающий Android телеграм бот (с тестами) - Бесплатные <span>теоретические тесты для самопроверки.</span> А также информер на практических спринтах по Android.
Узнать подробнее
ИИ-ментор код-ревью и голосовые собесы
Открыть