Kotlin和Java的序列化都是经过实现Serializable或者Parcelable接口来完成的,只是两种语言在具体的实现方式上有所区别,下面经过一个简单的示例来看一下具体的区别:java
示例代码:markdown
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);
}
复制代码
主要关注几个关键点:app
- Test构造函数,不要使用默认无参构造函数。使用Parcelable序列化时IDE会提示建立一个参数为Parcel的构造函数,咱们按照提示添加就行
- 须要重写Parcelable的两个方法describeContents,writeToParcel
- CREATOR默认是没有添加的,按照IDE提示添加就行,须要特别注意的是Creator泛型中的泛型类型必须和当前类保持一致
kotlin中使用Parcelable实现序列化有两种方式,一种是相似Java的方式,一种是使用注解的方式。先来看一下相似Java的传统方式:ide
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。函数
再来看一下使用注解如何实现:ui
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包)。this
Java中直接实现Serializable接口便可,无需重写任何方法,由于Serializable是一个空接口spa
public class Test implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
相似Java,不须要使用任何注解插件
class TestKT() : Serializable {
var test:String?=null
}
复制代码
以上就是我的总结的Java和Kotlin实现序列化的区别code