Serializable与Parcelable

来源:互联网 发布:Java加密解密 面试 编辑:程序博客网 时间:2024/05/29 03:14

1、引言

Intent作为四大组件的中间桥梁,在安卓开发中扮演着不可或缺的角色。在往常的开发过程中,传递的多为基本数据类型,类似int,String等。而作为复杂数据类型则无法像基本数据类型一般简单的进行传递,它需要一个序列化过程。


2、序列化两种方式

序列化的方式有2种:SerializableParcelable。那这两种序列化方式有什么区别呢?

2.1 作用

Serializable由Java提供,它的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。它使用起来简单,但是需要做大量的I/O操作,适用于网络传输本地存储。

Parcelable为Android特有,它的设计初衷就是因为Serializable效率过慢,为了在程序内不同组间以件及不同Android程序间(AIDL)高效的传输数据而设计,主要用于内存序列化。这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

2.2 选择

从2.1中可看出,单从效率上看,Parcelable效率较高,内存开销小,故而在内存间数据传输推荐使用parcelable,例如Activity之间的数据传递,而Serializable在数据持久化上(如本地保存、网络通信等)则表现出Parcelable无法替代的作用。更主要的是,不同的Android版本的Parcelable可能会不一样,所以通常在安卓开发上是不建议使用Parcelable序列化的。

2.3 代码实现

2.3.1 Serializable序列化演示

Serializable的序列化过程较为简单,只要实现Serializable接口即可。
演示代码如下:
Book实体类:

public class Book implements Serializable {    private static final long serialVersionUID = 1700400696309660612L;    private  int price;// 价格    private String name;// 书名    private String author;// 作者    //省略了get/set方法}

MainActivity类传递过程:

Book book=new Book();book.setPrice(100);book.setName("《边城》");book.setAuthor("沈从文");Intent intent=new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("Book", book);MainActivity.this.startActivity(intent);

SecondActivity类获取:

Intent intent=getIntent();book=(Book) intent.getSerializableExtra("Book");

2.3.2 Parcelable序列化演示

Parcelable的序列化需要实现Parcelable接口,同时重写describeContents()和writeToParcel()方法。
先上示例代码:
Watch实体类:

public class Watch implements Parcelable {    private String name;// 手表名    private int price;// 价格    private String origin;// 原产地    /**     * 无参构造,提供给外部实例化使用     */     public Watch() {}    /**     * 有参构造,仅提供createFromParcel()使用     */      private Watch(Parcel in) {        name = in.readString();        price = in.readInt();        origin = in.readString();      }      @Override      public int describeContents() {        return 0;      }      // 将对象中的属性保存至目标对象dest中      @Override      public void writeToParcel(Parcel dest, int arg1) {        dest.writeString(name);        dest.writeInt(price);        dest.writeString(origin);      }    public static final Parcelable.Creator<Watch> CREATOR = new Parcelable.Creator<Watch>() {        // 重写createFromParcel方法,创建并返回一个获得了数据的user对象        @Override        public Watch createFromParcel(Parcel source) {          return new Watch(source);        }        @Override        public Watch[] newArray(int size) {          return new Watch[size];        }    };    //省略get/set方法}

MainActivity类传递过程:

Watch watch=new Watch();watch.setName("Apple");watch.setOrigin("USA");watch.setPrice(5400);Intent intent=new Intent(MainActivity.this,SecondActivity.class);intent.putExtra("Watch", watch);MainActivity.this.startActivity(intent);

SecondActivity类获取:

Intent intent=getIntent();watch=intent.getParcelableExtra("Watch");

从上面可以看出,Parcelable的序列化过程较Serializable复杂,它不像前者一般把整个对象进行序列化,而是将Watch对象中的各个属性进行序列化,而后通过一个CREATOR对象再组装成一个Watch对象。


3、注意点

  1. Parcelable序列化的过程中,writeToParcel()和createFromParcel()的属性设置顺序和数据类型要一致;
  2. Serializable序列化不保存静态变量(原因:序列化保存的是对象的状态,静态变量属于类的状态),可以使用Transient关键字对部分字段不进行序列化。
  3. Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写。
  4. Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
0 0
原创粉丝点击