kotlin序列化遇到的坑

使用kotlin开发代码一段时间了,他的代码量确实相对Java来说比较优雅,各种语法糖使用起来也是非常方便,但是其中也遇到一些坑,比如本篇文章将要介绍的序列化方面的坑,这个坑主要是采用kotlin原声写法产生的,具体三方框架时候存在问题本篇不做介绍,感兴趣的可以自己实验。
这个坑就是JavaBean实现Parcelable接口,JavaBean会自动实现序列化的相关方法,比如下代码:

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)
        }
    }
}

之前一直都是这么使用的,也没有发现问题,然后本次需求中有些字段是 ArrayList<String>或者是实现了Parcelable接口的对象之后就不能序列化成功了,后来发现,原来kotlin自动生成的代码中居然没有对这些字段的数据实现序列化,倒是这些字段序列化失败,这个感觉有点坑。
目前我的做法是自己手动实现这些方法例如:针对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)
        }
    }
}

同样序不能自动生成的代码还有实现了Parcelable接口的bean 以及这个 bean对象的集合,这些都需要自己手动添加代码。
其实说白了就是kotlin的代码自动生成偷懒了,它只是生成了基本类型的序列化代码。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 段子 公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:“大爷,太极这玩意儿花拳绣腿,你练...
    大公爵阅读 17,902评论 4 41
  • What? 何为序列化与反序列化?序列化:将对象转化为二进制序列的过程反序列化:将二进制序列恢复为原始对象的过程 ...
    LilacZiyun阅读 3,073评论 0 15
  • 序列化:指数据持久化,永久性的将数据保存在磁盘的过程。反序列化:将数据从磁盘中读取出来并恢复为原对象的一个过程。在...
    Android_YangKe阅读 525评论 0 4
  • 1:首先来对序列化进行解释 序列化是什么? 将对象转化为字节流。 反序列化是什么? 将字节流转化为对象。 2:接下...
    Y_Sunny_U阅读 2,607评论 0 4
  • 文/云端一梦 当太阳被黑夜包裹炽热消退消减成一个符号 月亮盗取一节符文挥洒冰冷洒,一湖冰清 孤独的减一叶舟。穿梭寻...
    云端一梦l阅读 2,333评论 58 96