android学习

Kotlin 序列化

2021-08-02  本文已影响0人  努尔江
2021-08-02_12-34.png

概念:

序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。

实现:

Java 通过实现Serializable接口进行序列化.

public class User implements Serializable {
    private static final long serialVersionUID = 8241970228713425282L;  
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [name=" + name + "]";
    }
}

Android 通过实现Parcelable接口.

public class User implements Parcelable {
   private String name;

   protected User(Parcel in) {
       name = in.readString();
   }

   public static final Creator<User> CREATOR = new Creator<User>() {
       @Override
       public User createFromParcel(Parcel in) {
           return new User(in);
       }

       @Override
       public User[] newArray(int size) {
           return new User[size];
       }
   };

   @Override
   public int describeContents() {
       return 0;
   }

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeString(name);
   }
}

Android-Kotlin 通过 Parcelize 接口

准备工作

  1. 项目必须支持Kotlin。

Build.Gradle中加入(新):

    plugins {
      id 'kotlin-android'  //让项目支持Kotlin
      id 'kotlin-parcelize' //Kotlin Parcelize
    }
    
    dependencies {
        //Kotlin 核心库也是必须的。请用最新的版本
       implementation 'androidx.core:core-ktx:1.6.0' //Kotlin core
    }

老的项目写法(旧):

    apply plugin: 'kotlin-android' //kotlin-android
    apply plugin: 'kotlin-parcelize' //parcelize
   
    dependencies {
      implementation 'androidx.core:core-ktx:1.6.0' //Kotlin core
    }
  1. 序列化实现
    //对应的库
    import android.os.Parcelable
    import kotlinx.parcelize.Parcelize

    //注释Parcelize,实现Parcelable

    @Parcelize
    data class UserBean(
    var Name:String,
    ): Parcelable

3.Object 类的序列化
需要子类Object也实现序列化。

@Parcelize
data class UserBean(
    var Name:String,
    var userDetails: UserDetails
): Parcelable

@Parcelize
data class UserDetails(
    var sex:Boolean,
    val age:Int,
    val address:String
) : Parcelable

注意事项:

1.如果序列化的成员变量或成员对象可能会出现null的话,那么必须是Nullable定义(变量类型后面加问号),不然会出现反序列化失败(Error,不是Exception)的情况。
上面的序列化应该是:

    @Parcelize
    data class UserBean(
        //name 不会为空的情况。
        var Name:String,
        //可能会空时,请注意问号。
        var userDetails: UserDetails?
    ): Parcelable

    @Parcelize
    data class UserDetails(
        var sex:Boolean,
        val age:Int,
        //可能会空
        val address:String?
    ) : Parcelable

来就来了,点个赞贝。

上一篇 下一篇

猜你喜欢

热点阅读