概念:
序列化:把对象转化为可传输的字节序列过程称为序列化。
反序列化:把字节序列还原为对象的过程称为反序列化。
实现:
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
来就来了,点个赞贝。