序列化Serializable和Parcelable的区别详解

什么是序列化,为什么要进行序列化

答:对象要进行传输(如: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 CREATOR = new Creator() {
        @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

你可能感兴趣的:(Android原理,序列化,Serializable,Parcelable)