Android序列化实现接口Serializable与Parcelable详解
懒到死的程序员 人气:0一、Serializable(对象)
只需要实现Serializable 接口即可。将一个对象序列化转换成可存储或传输的状态,然后再强转回来使用(反序列化)。
class Person : Serializable { var name = "" var age = 0 } //传递 OneActivity { val person = Person().apply { name = "张三" age = 18 } Intent(this, TwoActivity::class.java).also { it.putExtra("person", person) startActivity(it) } } //获取 TwoActivity { val person = intent.getSerializableExtra("person") as Person //反序列化成对象 }
二、Parcelable(属性)
将一个对象进行分解,分解后的每一个属性都是Intent 所支持的数据类型。
2.1 实现方式(不推荐)
创建一个类实现 Parcelable 接口,定义好属性,按 ctrl+1 编译器会自动帮我们生成。
- 实现 Parcelable 接口,重写 describeContents() 和 writeToParcel() 两个函数。describeContents() 直接返回 0 就行。writeToParcel() 调用 writeXXX() 将类中属性一一写入。
- 创建一个名为 CREATOR 的伴生对象实现 Parcelable.Creator 接口,将泛型类型指定为<Person>,重写 createFromParcel() 和 newArray() 两个函数。createFromParcel()中创建一个 Person 对象返回,并调用 readXXX() 将之前写入的属性一一读出(注意读写的顺序要一致)。newArray()中调用 arrayOfNulls() 传入形参 size 作为数组大小即可。
class Person() : Parcelable { var name = "" var age = 0 constructor(parcel: Parcel) : this() { //读出 name = parcel.readString() ?: "" age = parcel.readInt() } //写入 override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(name) parcel.writeInt(age) } //返回0就行 override fun describeContents(): Int { return 0 } //伴生对象实现接口 companion object CREATOR : Parcelable.Creator<Person> { //返回对象 override fun createFromParcel(parcel: Parcel): Person { return Person(parcel) } //返回一个数组,形参 size 作为数组大小 override fun newArray(size: Int): Array<Person?> { return arrayOfNulls(size) } } } //传递方式和 Serializable 一样,使用如下: TwoActivity { val person = intent.getParcelableExtra("person") }
2.2 注解方式(推荐)
Kotlin提供了更简便的写法,传递的属性都需要定义在主构造中。
//Module Gradle 引入插件 plugins { id 'kotlin-parcelize' } //使用 @Parcelize class Person(val name: String, var age: Int) : Parcelable
加载全部内容