Hi,欢迎来到华清远见移动互联网学院官网!国内王牌JAVAEE培训、Android培训、Python培训、HTML5培训、UI培训、JAVA培训、VR培训机构!

  • 400-611-6270
  • 新浪微博
  • 微信
您当前的位置:移动互联网学院 > Android开发 > Android Serializable和Parcelable序列化

Android Serializable和Parcelable序列化

时间:2017-07-13 09:28 来源:移动互联网学院

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)

  • 北京

    010-82600385/6

    北京市海淀区西三旗悦秀路北京明园大学校内

  • 上海

    021-54485127

    上海市徐汇区漕溪路250号银海大楼11层

  • 深圳

    0755-25590506

    深圳市龙华新区人民北路美丽AAA大厦15层

  • 成都

    028-85405115

    成都武侯区科华北路99号科华大厦2层

  • 南京

    025-86551900

    南京市白下区汉中路185号鸿运大厦11层

  • 武汉

    027-87804688

    武汉工程大学卓刀泉校区科技孵化器大楼11层

  • 西安

    029-88756251

    西安市高新区高新1路12号天公大厦3层

  • 广州

    020-38342087

    广州市天河软件园柯木塱园5栋三层

  • 沈阳

    024-24349000

    沈阳市沈河区北顺城路137号锦峰大厦7层

  • 济南

    0531-88898293

    济南市高新区舜华路三庆世纪财富中心B3座6层

  • 重庆

    023-68064704

    重庆市九龙坡区渝州路87号双薪时代九楼

  • 长沙

    0731-88713136

    长沙市开福区芙蓉中路海东青大厦B座11楼

Copyright © 2004-2017 华清远见教育集团 版权所有,京ICP备16055225号,京公海网安备110108001117号