Android对对象序列化主要有两种方式:Serializable和Parcelable。
Serializable实际是使用Java的放射机制对对象做序列化和反序列化,其性能远低于使用Parcelable。但是使用Java写的Parcelable有点繁琐,需要我们实现Parcelable接口,手写很多模板代码。
Java版Parcelable示例
public class User implements Parcelable{
private String id;
private String name;
public User(String id, String name, String grade){
this.id = id;
this.name = name;
}
// Getter and setter methods
.........
.........
// Parcelling部分
public User(Parcel in){
String[] data = new String[2];
in.readStringArray(data);
// 使用数组获取属性的值需要和writeToParcel()写进去的顺序一致
this.id = data[0];
this.name = data[1];
}
@Оverride
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.id,
this.name});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public User createFromParcel(Parcel in) {
return new User(in);
}
public User[] newArray(int size) {
return new User[size];
}
};
}
Java版的Parclable,需要重写wirteToParcel方法序列化对象,需要创建以Parcle为参数的构造函数用来对对象反序列化。需要构建Parclable.Creator。
这些代码大多数都是差不多,但我们还是要手写实现。
Kotlin Parcelable特性
Kotlin1.1.4新增了Parcelable特性,添加注解@Parcelize就可以自动生成相应的Parcelable代码。
上面的例子实现如下:
@Parcelize
data class User(val id: String, val name: String) : Parcelable
相当的简洁!
使用
1、kotlin:>=1.1.4
2、app的build.gradle添加插件
apply plugin: 'kotlin-android-extensions'
3、app的build.gradle下android配置添加
androidExtensions {
experimental = true
}
基于kotlin的build.gradle示例
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 26
defaultConfig {
...
}
buildTypes {
...
}
androidExtensions {
experimental = true
}
}
dependencies {
...
}
4、模型实现Parclable,添加@Parclize
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class User(val name: String, val age: Int) : Parcelable