kotlin知识点记录-序列化

Kotlin和Java的序列化都是通过实现Serializable或者Parcelable接口来完成的,只是两种语言在具体的实现方式上有所区别,下面通过一个简单的示例来看一下具体的区别:

1 Java中的Parcelable

示例代码:

public class Test implements Parcelable {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    protected Test(Parcel in) {
        name=in.readString();
    }

    public static final Creator<Test> CREATOR = new Creator<Test>() {
        @Override
        public Test createFromParcel(Parcel in) {
            return new Test(in);
        }

        @Override
        public Test[] newArray(int size) {
            return new Test[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
    }
复制代码

主要关注几个关键点:

  1. Test构造函数,不要使用默认无参构造函数。使用Parcelable序列化时IDE会提示创建一个参数为Parcel的构造函数,我们按照提示添加就行
  2. 需要重写Parcelable的两个方法describeContents,writeToParcel
  3. CREATOR默认是没有添加的,按照IDE提示添加就行,需要特别注意的是Creator泛型中的泛型类型必须和当前类保持一致

2 kotlin中的Parcelable

kotlin中使用Parcelable实现序列化有两种方式,一种是类似Java的方式,一种是使用注解的方式。先来看一下类似Java的传统方式:

传统方式
class TestKT() :Parcelable{
    var test:String?=null

    constructor(parcel: Parcel) : this() {
        test = parcel.readString()
    }

    override fun describeContents(): Int {
        TODO("Not yet implemented")
    }

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        TODO("Not yet implemented")
    }

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

        override fun newArray(size: Int): Array<TestKT?> {
            return arrayOfNulls(size)
        }
    }
}
复制代码

实现过程和Java一样,只是语言和语法变成了kotlin。

再来看一下使用注解如何实现:

注解方式
import kotlinx.parcelize.Parcelize
@Parcelize
class TestKT() : Parcelable {
    var test:String?=null
}
复制代码

这里使用到了Parcelize注解,这个注解功能是在kotlin初期版本的时候被封装到Kotlin Android Extensions插件中的。不过目前这个插件已经被废弃不用了,相应的序列化功能也被迁移到了另外一个插件id kotlin-parcelize,所以如果我们的kotlin版本比较新,直接在app的build文件中引入kotlin-parcelize插件就可以使用Parcelize注解了(注意要import kotlinx.parcelize包)。

3 Java中的Serializable

Java中直接实现Serializable接口即可,无需重写任何方法,因为Serializable是一个空接口

public class Test implements Serializable {
    private String name;
    

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
复制代码

4 kotlin中的Serializable

类似Java,不需要使用任何注解

class TestKT() : Serializable {
    var test:String?=null
 }
复制代码

以上就是个人总结的Java和Kotlin实现序列化的区别

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享