Как хранить собственные классы на носителе

«Как хранить собственные классы на носителе» — вопрос из категории Базы данных, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для хранения собственных классов на носителе можно использовать сериализацию. В Android доступны несколько вариантов:

  1. Parcelable – более производительный, но требует ручной реализации:
data class User(val name: String, val age: Int) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString()!!,
        parcel.readInt()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }
        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }
}
  1. Serializable – проще в реализации, но медленнее:
data class User(val name: String, val age: Int) : Serializable
  1. Gson/Jackson – для хранения в виде JSON:
val gson = Gson()
val json = gson.toJson(user)
// Сохранить json в SharedPreferences/файл/БД

Для сложных структур лучше использовать Room или другие ORM.