序列化:为了保存在内存中的各种对象的状态,并可以把保存的对象的状态读出来。
一、Seralizable介绍:
1.Serializable 是java的序列化技术,最简单的使用方式为在需要序列化的class增加implements Serializable,并增加一个唯一个序列化id: private static final long serialVersionUID = 1L; 默认方式最好直接设置为1L,因为java sdk会自动进行hash计算,并生成唯一的UID值。手动设置serialVersionUID的好处是当前class如果改变了成员变量,比如增加或者删除之后,这个UID是不改变的,那么反序列化就不会失败;自动设置则在改变了成员变量之后就会重新计算获得新的UID,从而导致失败。不过,大多数情况下两者都可以。
2.Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class执行就可以,不需要手动去处理序列化和反序列化的过程,所以常常用于网络请求数据处理,Activity之间传递值的使用。
Activiyt之间传递如图:
3.Seralizable无法序列化静态变量,使用transient修饰的对象也无法序列化。
4.当一个父类实现序列化,子类自动实现序列化,不需要再显示实现Serializable接口。
二、Parcelable介绍:
1.Parcelable是android特有的序列化API,它的出现是为了解决Serializable在序列化的过程中消耗资源严重的问题,但是因为本身使用需要手动处理序列化和反序列化过程,会与具体的代码绑定,使用较为繁琐,一般只获取内存数据的时候使用。
2.而Parcelable依赖于Parcel,Parcel的意思是包装,实现原理是在内存中建立一块共享数据块,序列化和反序列化均是操作这一块的数据,如此来实现。
3.Parcelable的三个过程:序列化、反序列化和描述
序列化:
@Override
public void writeToParcel(Parcel dest, int flags) {
}
反序列化:
class User{
}
public static final Creator CREATOR = new Creator() {
@Override
public User createFromParcel(Parcel source) {
return null;
}
@Override
public User[] newArray(int size) {
return new User[0];
}
};
描述:
@Override
public int describeContents() {
return 0;
}
序列化的时候使用:writeXX
反序列化的时候使用:readXX
描述describecontents:
一般情况下设置为0,特别的为
public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
这种是当要求为file descriptor(文件描述符)被序列化的情况。
【参考文档】:
https://developer.android.com/reference/android/os/Parcelable
http://www.developerphil.com/parcelable-vs-serializable/
https://blog.csdn.net/Justin_1107/article/details/72903006