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

15 1 scaled - Android [Kotlin] для начинающих

Смотрите видеоурок бесплатно на удобной для вас платформе:

Интерфейс 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. Я бы рекомендовал его использовать в большинстве случаев.

Для тех, кто собрался стать Android-разработчиком

Пошаговаясхема
Пошаговая
схема

Описание процесса обучения от основ Kotlin до Android-разработчика

Бесплатныеуроки
Бесплатные
уроки

Авторский бесплатный курс по основам языка программирования Kotlin

Обучающийбот
Обучающий
бот

Тренажер и самоучитель по Котлин – бесплатные тесты и практика

Поделиться уроком

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *