Parcelable和Serializable有什么用,它们有什么差别?
Parcelable和Serializable都是用来完成对象序列化(什么是序列化,后面在做解释),Serializable是java提供的一个序列化接口,它是一个空的接口,为对象提供一个套标准的序列化和反序列化操作,Parcelable是Android提供的一个序列化接口,同样也提供了一套标准的序列化和反序列化操作;前面提到了一个序列化的概念,那么什么是序列化,为什么序列化呢?
-
什么是序列化
- 序列化是一种用来处理对象流的机制,对象流也就是将对象的内容进行流化,(流实际就是I/O)将数据分解成字节流;
-
为什么要序列化
- 序列化后的对象可以方便的保存到存储设备上或者网络传输给客户端;
-
序列化特点:
-
- 如果某个被序列化了,其子类也可以被序列化;
-
- 静态成员变量属于类不属于对象,不会参与序列化过程,transient修饰的成员变变量表示对象的临时数据,也不参与序列化过程,
-
Parcelable和Serializable差别
-
Serializable只需要定义一个类实现Serializable接口类,它就可以被序列化和反序列化,使用非简单但是开销很大,序列化和反序列化操作需大量I/O操作,效率低;
-
Parcelable需要用户自己实现序列化和反序列化操作,使用起来不像Serializable那么方便,效率高,是Android推荐的序列化方式,Parcelable主要用在内存序列化,Parcelable也可以将对象序列化到存储设备上或将对象序列化后通过网络传输,实现过程比较复杂,所以这两种场景下可以使用Serializable;
自定义一个类让其实现Parcelable,大致流程是什么?
- 创建一个类实现Parcelable序列化接口
- 重写Parcelable接口类的describeContents、writeToParcel方法
- describeContents
- 返回的是当前序列化对象的文件描述,默认返回0,只有仅当当前对象中存在文件描述符时,返回1
- writeToParcel
- 通过Parcel一系列方法来完成序列化;
- describeContents
- 实现一个Parcelable.Creator接口,实例化一个静态的内部对象CREATOR,内部创建一个序列化对象和数组
demo:
public class Book implements Parcelable {
public String name;
public int price;
public boolean isNovel;
public Book(String name, int price, boolean isNewBook){
this.name = name;
this.price = price;
this.isNovel = isNewBook;
}
protected Book(Parcel in) {
name = in.readString();
price = in.readInt();
isNovel = in.readInt() == 1;
}
public static final Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel in) {
return new Book(in);
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(price);
dest.writeInt(isNovel ? 1 : 0);
}
}
复制代码
本文产出参考于Android开发艺术探索,是自己对序列化部分内容的一个总结