kotlin序列化遇到的坑

使用kotlin開發(fā)代碼一段時(shí)間了,他的代碼量確實(shí)相對(duì)Java來(lái)說(shuō)比較優(yōu)雅,各種語(yǔ)法糖使用起來(lái)也是非常方便,但是其中也遇到一些坑,比如本篇文章將要介紹的序列化方面的坑,這個(gè)坑主要是采用kotlin原聲寫法產(chǎn)生的,具體三方框架時(shí)候存在問(wèn)題本篇不做介紹,感興趣的可以自己實(shí)驗(yàn)。
這個(gè)坑就是JavaBean實(shí)現(xiàn)Parcelable接口,JavaBean會(huì)自動(dòng)實(shí)現(xiàn)序列化的相關(guān)方法,比如下代碼:

class DiaryBean() : Parcelable {
    var diaryId: Int = 0
    var praiseTotal: Int = 0
    var commentTotal: Int = 0

    constructor(parcel: Parcel) : this() {
        diaryId = parcel.readInt()
        praiseTotal = parcel.readInt()
        commentTotal = parcel.readInt()
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(diaryId)
        parcel.writeInt(praiseTotal)
        parcel.writeInt(commentTotal)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

之前一直都是這么使用的,也沒(méi)有發(fā)現(xiàn)問(wèn)題,然后本次需求中有些字段是 ArrayList<String>或者是實(shí)現(xiàn)了Parcelable接口的對(duì)象之后就不能序列化成功了,后來(lái)發(fā)現(xiàn),原來(lái)kotlin自動(dòng)生成的代碼中居然沒(méi)有對(duì)這些字段的數(shù)據(jù)實(shí)現(xiàn)序列化,倒是這些字段序列化失敗,這個(gè)感覺有點(diǎn)坑。
目前我的做法是自己手動(dòng)實(shí)現(xiàn)這些方法例如:針對(duì)ArrayList<String>需要在writeToParcel方法中添加parcel.writeStringList(字段名稱),在 constructor()方法中加入: 字段名稱 = parcel.createStringArrayList()
加入ArrayList<String>之后的代碼如下

class DiaryBean() : Parcelable {
    var diaryId: Int = 0
    var praiseTotal: Int = 0
    var commentTotal: Int = 0
    var pictureUrlList: ArrayList<String>? = null

    constructor(parcel: Parcel) : this() {
        diaryId = parcel.readInt()
        praiseTotal = parcel.readInt()
        commentTotal = parcel.readInt()
        pictureUrlList = parcel.createStringArrayList()
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(diaryId)
        parcel.writeInt(praiseTotal)
        parcel.writeInt(commentTotal)
        parcel.writeStringList(pictureUrlList)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

同樣序不能自動(dòng)生成的代碼還有實(shí)現(xiàn)了Parcelable接口的bean 以及這個(gè) bean對(duì)象的集合,這些都需要自己手動(dòng)添加代碼。
其實(shí)說(shuō)白了就是kotlin的代碼自動(dòng)生成偷懶了,它只是生成了基本類型的序列化代碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 段子 公園里,一位仙風(fēng)鶴骨的老者在打太極,一招一式都仙氣十足,一個(gè)年輕人走過(guò)去:“大爺,太極這玩意兒花拳繡腿,你練...
    大公爵閱讀 18,163評(píng)論 4 41
  • What? 何為序列化與反序列化?序列化:將對(duì)象轉(zhuǎn)化為二進(jìn)制序列的過(guò)程反序列化:將二進(jìn)制序列恢復(fù)為原始對(duì)象的過(guò)程 ...
    LilacZiyun閱讀 3,132評(píng)論 0 15
  • 序列化:指數(shù)據(jù)持久化,永久性的將數(shù)據(jù)保存在磁盤的過(guò)程。反序列化:將數(shù)據(jù)從磁盤中讀取出來(lái)并恢復(fù)為原對(duì)象的一個(gè)過(guò)程。在...
    Android_YangKe閱讀 551評(píng)論 0 4
  • 1:首先來(lái)對(duì)序列化進(jìn)行解釋 序列化是什么? 將對(duì)象轉(zhuǎn)化為字節(jié)流。 反序列化是什么? 將字節(jié)流轉(zhuǎn)化為對(duì)象。 2:接下...
    Y_Sunny_U閱讀 2,670評(píng)論 0 4
  • 文/云端一夢(mèng) 當(dāng)太陽(yáng)被黑夜包裹熾熱消退消減成一個(gè)符號(hào) 月亮盜取一節(jié)符文揮灑冰冷灑,一湖冰清 孤獨(dú)的減一葉舟。穿梭尋...
    云端一夢(mèng)l閱讀 2,353評(píng)論 58 96

友情鏈接更多精彩內(nèi)容