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);
}
复制代码
主要关注几个关键点:
- Test构造函数,不要使用默认无参构造函数。使用Parcelable序列化时IDE会提示创建一个参数为Parcel的构造函数,我们按照提示添加就行
- 需要重写Parcelable的两个方法describeContents,writeToParcel
- 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