当前位置: 移动互联网学院 > Android开发 > Android Serializable和Parcelable序列化
Android Serializable和Parcelable序列化 时间:2017-07-13     来源:移动互联网学院

1.序列化的目的

  (1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中

  (2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)

  (3).将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)

  (4).Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)

  (5).序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.

  (6).在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

使用Pacelable接口,重写Parcelable接口中的两个方法和静态变CREATOR

public class MyClass implements android.os.Parcelable {

    private String a = null;

    private int b = 0;

    private MyClassA myClassA = new MyClassA;

    private List<MyClassB> myClassB = new ArrayList<MyClassB>();

    public MyClass(Parcel parcel) {

        // 按变量定义的顺序读取

        a = parcel.readString();

        b = parcel.readInt();

        myClassA = parcel.readParcelable(MyClassA.class.getClassLoader());

        Parcelable[] pars = parcel.readParcelableArray(MyClassB.class.getClassLoader());

        myClassB = Arrays.asList(Arrays.asList(pars).toArray(new MyClassB[pars.length]));

    }

    @Override

    public int describeContents() {

        return 0;

    }

    @Override

    public void writeToParcel(Parcel dest, int flags) {

        // 按变量定义的顺序写入

        dest.writeString(a);

        dest.writeString(b);

        dest.writeParcelable(myClassA, flags);

        dest.writeParcelableArray((myClassB.toArray(new MyClassB[myClassB.size()])), flags);

    }

    public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {

        @Override

        public Param createFromParcel(Parcel source) {

            return new MyClass(source);

        }

        @Override

        public MyClass[] newArray(int size) {

            return new MyClass[size];

        }

    };

}

使用Serializable接口,定义序列化ID自定义类MyClassMyClassAMyClassB

示例:

MyClass:

public class MyClass implements java.io.Serializable {

    private static final long serialVersionUID = 1L; // 定义序列化ID

    private String a = null;

    private int b = 0;

    private MyClassA myClassA = new MyClassA;

    private List<MyClassB> myClassB = new ArrayList<MyClassB>();

}

MyClassA、MyClassB实现方法同上。

TestActivity.java:

MyClass myClass = new MyClass("a", "b", new MyClassA(), new ArrayList<MyClassB>());

Intent intent = new Intent(this, SerializableActivity.class);

Bundle bundle = new Bundle();

bundle.putSerializable("key", myClass);

intent.putExtras(bundle);

startActivity(intent);

总结:

.Parcelable与Serializable的性能比较

首先Parcelable的性能要强于Serializable的原因我需要简单的阐述一下

  1). 在内存的使用中,前者在性能方面要强于后者

  2). 后者在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色

  3). Parcelable是以Ibinder作为信息载体的.在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable,既然是内存方面比价有优势,那么自然就要优先选择.

  4). 在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上.

  但是:虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)