版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zp0119/article/details/79093405
前言:
序列化:将数据结构或对象转换成可用于存储或传输的数据格式的过程,在序列化期间,数据结构或对象将其状态信息写入到临时或持久性存储中;
反序列化:将序列化生成 的数据还原成数据结构或对象的过程。
一、Serializable
Serializable 是JDK提供的接口,序列化方式是基于磁盘或网络的。Serializable 接口是一种标识接口,也就是无需实现方法,便能实现序列化。
缺点:使用反射机制,在序列化过程中产生很多临时文件,容易触发垃圾回收,序列化的过程比较慢。
序列化过程中使用 serialVersionUID 的版本号和序列化的类关联,如果序列化和反序列化的UID不同,会报 InvalidClassException 异常;解决方式是显式指定 UID(IDE 为我们随机生成)。
/**
* 直接实现 Serializable 接口完成序列化
*/
public class ZpSerializableBean implements Serializable{
private static final long serialVersionUID = 9165010654231l;
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二、Parcelable
Parcelable 是Android SDK 提供的,它是基于内存的,速度快;一般Android 中跨进程对象的传递 一般使用 Parcelable。缺点:需要生成大量的模板代码。可以使用Studio 的插件 Android Parcelable code generator ,一键生成模板代码。
public class ZpParcelableBean implements Parcelable {
private int id;
private String name;
public ZpParcelableBean() {
}
// 接口内容的描述,一般默认返回0
@Override
public int describeContents() {
return 0;
}
// 序列化的方法,将类的数据写入到 Parcel 容器中
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(this.name);
}
protected ZpParcelableBean(Parcel in) {
this.id = in.readInt();
this.name = in.readString();
}
public static final Parcelable.Creator<ZpParcelableBean> CREATOR = new Parcelable.Creator<ZpParcelableBean>() {
// 反序列化方法,将 Parcel 还原成 Java 对象
@Override
public ZpParcelableBean createFromParcel(Parcel source) {
return new ZpParcelableBean(source);
}
// 提供给外部类反序列化这个数组使用
@Override
public ZpParcelableBean[] newArray(int size) {
return new ZpParcelableBean[size];
}
};
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}