作为android开发者都知道,开发中具备两种序列化的操作,一个是Serializable,另一个是在Android中引入的Parcelable;从google官网的态度而言,Parcelable的效率更高。但是两者的实现方式却有很大区别,举个例子
image.pngSerializable
class Human:Serializable {
}
Parcelable
class Person() :Parcelable {
var name:String = ""
var age:Int = 0
constructor(parcel: Parcel) : this() {
}
override fun describeContents(): Int {
return 0
}
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeString(name)
dest.writeInt(age)
}
companion object CREATOR : Parcelable.Creator<Person> {
override fun createFromParcel(parcel: Parcel): Person {
val person = Person()
person.name = parcel.readString()?:""
person.age = parcel.readInt()?:0
return person
}
override fun newArray(size: Int): Array<Person?> {
return arrayOfNulls(size)
}
}
}
发现什么问题了吗?没错,Percelable的实现方式更复杂,Serializable只需实现一个接口就完成了,管他那么多,Serializable就完事了(这也是我至今都喜欢Serializable的原因)
后面在阅读官方文档的时候,发现Percelable也有了简单的方式,而且官方也是推荐使用 Percelable,所以还是更改了使用习惯,而且,新的方式也很简单点击跳转
1.Parcelable 实现生成器
首先引入组件
plugins {
id 'kotlin-parcelize'
}
实现类主体结构
import kotlinx.parcelize.Parcelize
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable
2.自定义序列化逻辑
有的同学就会问了,如果我想自己写序列化和反序列化逻辑呢?当然也有办法,就是在类内部实现write和create方法
@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
private companion object : Parceler<User> {
override fun User.write(parcel: Parcel, flags: Int) {
// Custom write implementation
}
override fun create(parcel: Parcel): User {
// Custom read implementation
}
}
}
3.Parcelable 支持的类型
应该说大部分的类型就是支持,但是如果真遇到了某个类型不被支持,但是开发者就是想要序列化,Parcelable也有自定义的方法,就是
class ExternalClass(val value: Int)
object ExternalClassParceler : Parceler<ExternalClass> {
override fun create(parcel: Parcel) = ExternalClass(parcel.readInt())
override fun ExternalClass.write(parcel: Parcel, flags: Int) {
parcel.writeInt(value)
}
}
使用也很方便
// Class-local parceler
@Parcelize
@TypeParceler<ExternalClass, ExternalClassParceler>()
class MyClass(val external: ExternalClass) : Parcelable
// Property-local parceler
@Parcelize
class MyClass(@TypeParceler<ExternalClass, ExternalClassParceler>() val external: ExternalClass) : Parcelable
// Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith<ExternalClassParceler>() ExternalClass) : Parcelable
简单也易上手,但是也温馨提醒,大量数据跨组件传递,会存在为以下情况
image.png
因为intent中能带的数据有上限(这个根据不同的android厂商而异),建议这时候试用viewmodel来做数据传递
image.png
网友评论