美文网首页
Kotlin Parcelable

Kotlin Parcelable

作者: sexyhair | 来源:发表于2018-11-27 10:54 被阅读0次

Kotlin语言下 序列化

AndroidStudio快捷键:option + 回车

选择第一项或者再次按回车,则会自动生成Parcelable相关内容

生成后有可能会需要修改

不需要修改的:

data class TextMatchTopic(var id: String = "",
                          var topic_en: String = "",
                          var topic_cn: String = "",
                          var topic_sa: String = "",
                          var pid: String = "",
                          var created_at: String = "") : Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString()) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(id)
        parcel.writeString(topic_en)
        parcel.writeString(topic_cn)
        parcel.writeString(topic_sa)
        parcel.writeString(pid)
        parcel.writeString(created_at)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<TextMatchTopic> {
        override fun createFromParcel(parcel: Parcel): TextMatchTopic {
            return TextMatchTopic(parcel)
        }

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

需要修改的:

属性中有自定义类集合时:
data class TextMatchInfoDataBean(val uid: String,
                                 val similar: String = "0",
                                 var topic: List<TextMatchTopic> = arrayListOf()) : Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readString(),
            parcel.readString(),
            //自动生成时生成的是: parcel.createTypedArrayList(TextMatchTopic))
            //`需要加入.CREATOR` 否则在intent传递数据时会有崩溃
            parcel.createTypedArrayList(TextMatchTopic.CREATOR)) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(uid)
        parcel.writeString(similar)
        parcel.writeTypedList(topic)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<TextMatchInfoDataBean> {
        override fun createFromParcel(parcel: Parcel): TextMatchInfoDataBean {
            return TextMatchInfoDataBean(parcel)
        }

        override fun newArray(size: Int): Array<TextMatchInfoDataBean?> {
            return arrayOfNulls(size)
        }
    }
}
属性中有自定义类时:
data class TextMatchInfoBean(val data: TextMatchInfoDataBean = TextMatchInfoDataBean("", "", arrayListOf())) : CommonBean(), Parcelable {
    constructor(parcel: Parcel) : this(
            //注意:parcel.readParcelable后是否有<>
            parcel.readParcelable<TextMatchInfoDataBean>(TextMatchInfoDataBean::class.java.classLoader)) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeParcelable(data, flags)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<TextMatchInfoBean> {
        override fun createFromParcel(parcel: Parcel): TextMatchInfoBean {
            return TextMatchInfoBean(parcel)
        }

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

总结:快捷键生成后改动注意点:

1 - 确认类是否 “:Parcelable”无则加上以实现Parcelable
2 - 确认writeToParcel(parcel: Parcel, flags: Int)是否有 :
        super.writeToParcel(parcel, flags),有则去掉
3 - 属性中有类集合时注意构造方法中
        createTypedArrayList(XXX.CREATOR)是否带有“.CREATOR”,无则加上

相关文章

网友评论

      本文标题:Kotlin Parcelable

      本文链接:https://www.haomeiwen.com/subject/hsecqqtx.html