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