Android之IPC(一 序列化对象的使用和基础讲解)
这之后的几篇博客,都是参照安卓开发艺术探索和自己搜索的一些东西加以讲解(顺便推荐以下这本书,真的很好,你懂的)
Serializable(java序列化接口)
使用篇(我们我们简单定义一个bean类实现Serializable即可)
public class SerializableBean implements Serializable {
// 序列化表示
private static final long serialVersionUID = -882536256746663652L;
private int key;
private String value;
public SerializableBean(int userId, String userName) {
this.userId = userId;
this.userName = userName;
}
@Override
public String toString() {
return userId + " " + userName;
}
}
接下来就是序列化以及反序列过程
// 序列化过程
SerializableBean outSerializableBean = new SerializableBean(199140042, "JDH");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(), "cache.txt")));
out.write(outSerializableBean);
out.close();
// 反序列化过程
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(getCacheDir(), "cache.txt")));
SerializableBean inSerializableBean = (SerializableBean) in.readObject();
in.close();
这就是具体的逻辑:可能大家会有疑问序列化表示,也就是一个long类型的数能不能省略?
一般序列化的时候,这个serialVersionUID当作一个中介,比如写入当前序列化文件,反序列的时候会用的到这个数字,进行检测,判断和当前类的序列化id是否一致,一致就说明两者版本的一致性,可以成功的反序列化,否则可能会报错。
这个id值,是系统生成的一个hash值,如果没有给出这个值,当类结构发生一定的改变,系统会重新计算,如果不一样就会报错,反序列化失败。当然,如果你的类结构发生了过大的变化,也会是失败,这个值,可以保证我们最大限度的反序列化保存之前的数据。
所以,我们最好加上这个序列化值。
Parcelable(Android的序列化接口)
显而易见,在Android中这个会强大的多,下面是一个简单的演示例子。(基本就是一个模板)
public class ParcelableBean implements Parcelable {
private int key;
private String value;
private boolean isOK;
public ParcelableBean(int key, String value, boolean isOK) {
this.key = key;
this.value = value;
this.isOK = isOK;
}
// 从序列化对象创建原始对象
protected ParcelableBean(Parcel in) {
key = in.readInt();
value = in.readString();
isOK = in.readByte() != 0;
}
// 完成序列化功能
@Override
public void writeToParcel(Parcel dest, int flags) {
// 当前是什么类型的值就写如什么类型的值
dest.writeInt(key);
dest.writeString(value);
dest.writeByte((byte) (isOK ? 1 : 0));
}
// 返回对象描述(几乎都是返回0的,搜索得知含有文件描述符返回1)
@Override
public int describeContents() {
return 0;
}
// 完成发序列化的功能
public static final Creator<ParcelableBean> CREATOR = new Creator<ParcelableBean>() {
@Override
public ParcelableBean createFromParcel(Parcel in) {
// 从序列化对象创建原始对象
return new ParcelableBean(in);
}
@Override
public ParcelableBean[] newArray(int size) {
// 创建一定指定大小数组
return new ParcelableBean[size];
}
};
}
小结:总结两者的区别和联系
联系:两者都是序列化和反序列对象的,可以在IPC(进程间通信时传递,比如Intent)
区别:Serializable使用较为简单,但是其中序列化和反序列化时候会有大量的IO操作,使用的开销比较大,Parcelable在Android平台上,虽然使用麻烦点,但是效率比较高,所以在内存中传递的时候用Parcelable比较好,同时我们也看到了,Serializable序列化写如文件,它的持久化比较好,需要保存的化用Serializable。