亲宝软件园·资讯

展开

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 编译器会自动帮我们生成。

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

加载全部内容

相关教程
猜你喜欢
用户评论