使用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)生成偷懶了,它只是生成了基本類型的序列化代碼。