继续了解IPC还需要了解Serializable接口Parcelable接口和Binder
Serializable接口
一个序列化接口,它是一个空接口,用于对像的实例化,那么新的问题来了 到底啥叫序列化还有反序列化又是个啥?
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
想要对一个对象实现序列化,只需要这个类实现Serializable接口并声明一个serivalVersionUID即可;serivalVersionUID不是必须的但是如果不声明将会对反序列化过程造成影响。
serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
Parcelable接口
public class User implements Parcelable {
@Override
public int describeContents() {
// TODO Auto-generated method stub
/**
* 返回当前对象的内容描述。如果含有文件描述,返回1,否则返回0
* 基本上都是返回0的
*/
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
/**
* 这里将当前对象写入序列化结构中 其中flags有两种值:0或者1.
* 为1时标示当前对象需要作为返回值返回,不能立即释放资源
* 基本上都是返回0的
*/
}
public static final Parcelable.Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
// TODO Auto-generated method stub
/**
* 从序列化后的对象中创建原始对象
*/
return new User(source);
}
@Override
public User[] newArray(int size) {
// TODO Auto-generated method stub
/**
* 创建指定长度的原始对象组
*/
return new User[size];
}
};
private User(Parcel in) {
/**
* 从序列化后的对象中创建原始对象
*/
}
}
这是一个典型用法,在序列化中需要实现的功能有序列化、反序列化和内容描述。
序列化是由writeToParcel()
方法来完成,最终是通过Parcel中的一系列write方法来完成的。
反序列化功能有CREATOR
来完成,其内部创建序列化对象和数组然后通过Parcel中的一系列read方法来完成反序列化过程。
内容描述功能由describeContents()
方法完成,几乎所有情况下这个方法都应该返回0,仅当 当前文件中存在文件描述符时,此方法返回1。
Parcelable和Serializable的选取
Serializable是Java中的序列化解接口,使用起来简单 但是开销大,序列化和反序列化过程需要大量的I/O操作。
Parcelable是Android中的序列化方式,因此更适合用在Android平台上,缺点就是用起来稍微麻烦了点,但是效率高。
Parcelable主要用在内存序列化上,通过Parcelable将对象序列化到设备存储中或者将对象序列化后通过网络传输也是可以的,但是过程会复杂,建议使用Serializable。
关于Binder的笔记放在下一篇小记中