美文网首页
kotlin序列化遇到的坑

kotlin序列化遇到的坑

作者: enjoy_coding | 来源:发表于2019-05-14 18:42 被阅读0次

    使用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的代码自动生成偷懒了,它只是生成了基本类型的序列化代码。

    相关文章

      网友评论

          本文标题:kotlin序列化遇到的坑

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