
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 接口
准备工作
- 项目必须支持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
    }
- 序列化实现
    //对应的库
    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
来就来了,点个赞贝。