kotlin中的序列化

我们可以在Intent中通过putExtra方法来添加要传递的数据,但该方法所支持的数据类型是有限的,当我们想传递一些自定义对象的时候,会发现无从下手。

而使用Intent来传递对象,通常有两种实现方式:Serializable和Parcelable。

Serializable

Serializable是序列化的意思,序列化后的对象可以在网络上进行传输,也可以存储到本地。而序列化的方式也十分简单,只需要让一个类去实现Serializable这个接口即可。

比如有一个Person类:

class Person : Serializable { 
    var name = "" 
    var age = 0 
}

这样我们就让Person类实现了Serializable接口,在activity中这样写:

val person = Person() 
person.name = "Tom" 
person.age = 20 
val intent = Intent(this, SecondActivity::class.java) 
//因为Person类实现了Serializable接口,所以我们可以直接putExtra
intent.putExtra("person_data", person) 
startActivity(intent)

此处我们使用intent启动了SecondActivity,在SecondActivity中我们这样获取:

val person = intent.getSerializableExtra("person_data") as Person

此处调用了intent的getSerializableExtra方法来获取传递过来的序列化对象,在将它强转为Person对象,这样我们就实现了使用intent传递对象的功能。

需要注意的是,这种传递对象的工作原理是,先将一个对象序列化成可存储或传输的状态,传递给另一个activity或者其他地方后,再将其反序列化为一个新的对象,而这也是序列化的概念。虽然这两个对象所存储的数据完全一致,但他们实际上是不同的对象。

Parcelable

不同于Serializable将对象序列化,Parceable的实现原理是将一个完整的对象进行分解,而分解后的每一部分,都是intent所支持的数据类型。

修改Person:

class Person() : Parcelable {
    var name = ""
    var age = 0

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

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Person> {
        override fun createFromParcel(parcel: Parcel): Person {
            val person = Person()
            //读取顺序必须和写入顺序完全一致
            person.name = parcel.readString() ?: ""//读取name
            person.age = parcel.readInt()//读取age
            return person
        }

        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}

在FirstActivity中仍可以使用相同代码传递Person对象,但在SecondActivity中需要进行修改:

val person = intent.getParcelableExtra("person_data") as Person

不过,这种实现方式写起来复杂了许多,为此kotlin中提供了更简单的办法,但前提是传递的所有数据都要封装在对象的主构造函数中。

修改Person:

@Parcelize
calss Person(var name: String, var age: Int) : Parcelable

对比之下,Serializable的方式较为简单,但会将整个对象序列化,效率会低一点,因此更多时候我们会使用后者实现Intent传递对象的功能。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值