什么是序列化,为什么要进行序列化
答:对象要进行传输(如:activity 与activity间 ,网络间 进程间等等)、存储到本地就必须进行序列化 。
这种可传输的状态就是序列化。
怎么序列化??两种
1.Serializable (java 自带)
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、RMI(Remote Method Invocation)以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。使用了反射技术,并且期间产生临时对象
Serializable序列化不保存静态变量,可以使用transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义
如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话说,用transient关键字标记的成员变量不参与序列化过程。
使用:对象继承 Serializable类即可实现序列化,就是这么简单,也是它最吸引我们的地方
public class ApprocalBean implements Serializable {
private String type;
}
2.Parcelable(Android专用)
Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。Parcelable方式的实现原理是将一个完整的对象进行分解,用起来比较麻烦,但我们有工具,还是很简单的具体如下
使用:1.继承 Parcelable
2、复写两个方法,分别是describeContents和writeToParcel
3、实例化静态内部对象CREATOR,实现接口Parcelable.Creator 。
说不如做,直接上图上代码
public class ApprocalBean implements Parcelable {
private String type;
private int postion;
public ApprocalBean() {
}
//读出
protected ApprocalBean(Parcel in) {
type = in.readString();
postion = in.readInt();
}
//实例化静态内部对象CREATOR
public static final Creator<ApprocalBean> CREATOR = new Creator<ApprocalBean>() {
@Override
public ApprocalBean createFromParcel(Parcel in) {
return new ApprocalBean(in);
}
@Override
public ApprocalBean[] newArray(int size) {
return new ApprocalBean[size];
}
};
@Override
public int describeContents() {
return 0;
}
//写入
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(type);
dest.writeInt(postion);
}
}
注意:1:实现一个没有参数的构造方法,不然在实例化对象时会报错
2:写入顺序和读出顺序要一致
如何选择
选择序列化方法的原则
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
4)android上应该尽量采用Parcelable,效率至上,效率远高于Serializable