Android 开发的时候,在对数据进行持久化的时候,或者数据传递的时候会用到序列化,这时候可以对当前数据类实现Serializable或者Parcelable接口。尤其是进程间通信时,传递数据需要对对象进行序列化。
序列化
- 序列化指的是将一个实例对象编码成字节流,并从字节流编码中重新构建对象实例的能力。将一个对象编码成字节流,称为序列化;从一个字节流中读出一个对象实例,称为反序列化。
使用场景
- 1.持久化存储对象
- 2.序列化对象在网络中传输
- 3.Bundle传输对象
- 4.进程间参传递对象(Parcelable)
Serializable和Parcelable 区别
-
Serializable
- Java自带
- 使用简单、代码量少,实现接口即可
- 效率相较Parcelable低
- 序列化时,产生大量临时变量,引起频繁GC
-
Parcelable
- Android 专用
- 使用稍复杂,代码量相较而言多点,需要重写相关序列化方法
- 性能比Serializable高十倍以上
- 对序列化完整对象进行拆解,每一部分都是Intent支持的类型。
使用
- Serializable 只需要添加 serialVersionUID即可。也可以不添加,但是由于在修改序列化类后,反序列话检查到serialVersionUID与运行时生成serialVersionUID不一致变会报错:InvalidClassException。规范推荐添加serialVersionUID。
public class UserModel implements Serializable{
private static final long serialVersionUID = 123456789L;
public String userName;
public int userId;
public UserModel(String userName, int userId) {
this.userName = userName;
this.userId = userId;
}
}
- Parcelable
public class UserModel implements Parcelable {
private String name;
private int id;
public UserModel(String name, int id) {
this.name = name;
this.id = id;
}
/**
* 序列化
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(id);
}
@Override
public int describeContents() {
// 大都返回0即可
return 0;
}
/**
* 反序列化
*/
public static final Creator<UserModel> CREATOR = new Creator<UserModel>() {
@Override
public UserModel createFromParcel(Parcel in) {
// 反序列对象
return new UserModel(in);
}
@Override
public UserModel[] newArray(int size) {
// 反序列数组
return new UserModel[size];
}
};
/**
* 使用反序列化得到的 Parcel 构造对象
*/
protected UserModel(Parcel in) {
name = in.readString();
id = in.readInt();
}
}
总结
- 在常见的Model序列化需要持久存储用Serializable,操作简单,上手快,工作效率提高。
- 在Bundle传递对象和进程间通讯的情况下使用Parcelable(内存间的传递),性能至上。