一.为啥需要它?
对象进行网络传输、持久化存储、跨进程传输等必须进行序列化,也就是将对象流化。否则不能进行上述操作。
二.怎样使用它?
- Serializable示例
public class Person implements Serializable{
private static final long serialVersionUID = 7382351359868556980L; //这个用于反序列化时判断是否是同一对象
private String name;
private int age;
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
- Parcelable示例
public class User implements Parcelable {
public String name;
public int id;
public Book book;
public User(String name, int id, Book book) {
this.name = name;
this.id = id;
this.book = book;
}
protected User(Parcel in) {
name = in.readString();
id = in.readInt();
book= in.readParcelable(getClass().getClassLoader());//反序列化类时需要传递当前线程的上下文类加载器
}
//主要用于反序列化对象
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) {//flags标识有两种值:0或者1,为1时标识当前对象需要作为返回值返回,不能立即释放资源,
//几乎所有情况都为0
dest.writeString(name);
dest.writeInt(id);
dest.writeParcelable(book,flags);
}
}
三.它的原理是什么?
序列化算法一般会按步骤做如下事情:
(1)将对象实例相关的类元数据输出。
(2)递归地输出类的超类描述直到不再有超类。
(3)类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
(4)从上至下递归输出实例的数据
四.附加知识有哪些?
Serializable注意事项
- 对象的属性会进行序列化,方法不会进行序列化。
- 序列化的对象进行反序列化时,如果两个类的属性不一致时,序列化对象的属性在反序列化对象中都有对应,则可以进行反序列化,否则,反序列会报错。
- 进行序列化的类和反序列的类的包名和类名都需要一样。
Parcelable注意事项
- Parcelable序列化写操作是通过writeToParcel(Parcel dest, int flags)实现
- Parcelable默认要实现反序列对象CREATOR ,系统会自动调用CREATOR对象中的方法。
Serializable和Parcelable对比。
编码上:
Serializable代码量少,写起来方便
Parcelable代码多一些
效率上:
Parcelable的速度比Serializable 高十倍以上
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。
这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了