Android使用Kotlin新特性Parcelize序列化对象

时间:2022-06-01 19:35:42

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