Android 中Kotlin实现Parcelable

作为android开发者都知道,开发中具备两种序列化的操作,一个是Serializable,另一个是在Android中引入的Parcelable;从google官网的态度而言,Parcelable的效率更高。但是两者的实现方式却有很大区别,举个例子

image.png

Serializable

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 {
        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 {
            return arrayOfNulls(size)
        }
    }
}

发现什么问题了吗?没错,Percelable的实现方式更复杂,Serializable只需实现一个接口就完成了,管他那么多,Serializable就完事了(这也是我至今都喜欢Serializable的原因)

后面在阅读官方文档的时候,发现Percelable也有了简单的方式,而且官方也是推荐使用 Percelable,所以还是更改了使用习惯,而且,新的方式也很简单点击跳转

image.png

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 {
        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 {
    override fun create(parcel: Parcel) = ExternalClass(parcel.readInt())

    override fun ExternalClass.write(parcel: Parcel, flags: Int) {
        parcel.writeInt(value)
    }
}

使用也很方便

// Class-local parceler
@Parcelize
@TypeParceler()
class MyClass(val external: ExternalClass) : Parcelable

// Property-local parceler
@Parcelize
class MyClass(@TypeParceler() val external: ExternalClass) : Parcelable

// Type-local parceler
@Parcelize
class MyClass(val external: @WriteWith() ExternalClass) : Parcelable

简单也易上手,但是也温馨提醒,大量数据跨组件传递,会存在为以下情况


image.png

因为intent中能带的数据有上限(这个根据不同的android厂商而异),建议这时候试用viewmodel来做数据传递

image.png

你可能感兴趣的:(Android 中Kotlin实现Parcelable)