Android Parcelable和Serializable的区别

1)为什么要实现Parfcelable接口来实现在Intent中传递对象?

      a、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable类。

      b、Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

 注意:Parcelable不能使用在将数据存储在磁盘上的情况,因为Parcelable不能很好的保存数据的持续性在外界有变化的情况下。因此在这种情况下,建议使用Serializable

 

1、作用

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

从上面的设计上我们就可以看出优劣了。

 

2、效率及选择

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

 

应用:

Serializable 代码

package com.weidingqiang.customnetroid;

import java.io.Serializable;

/**
 * Created by weidingqiang on 15/12/5.
 */
public class SDownVO implements Serializable {
    private String url;
    private String name;
    private boolean isdown;
    private int percent;

    public SDownVO(String url,String name,boolean isdown,int percent){
        this.isdown = isdown;
        this.url = url;
        this.name = name;
        this.percent =percent;
    }

    public String getUrl() {
        return url;
    }

    public String getName() {
        return name;
    }

    public boolean isdown() {
        return isdown;
    }

    public int getPercent() {
        return percent;
    }
}

传参

List<SDownVO> list = new ArrayList<SDownVO>();
list.add(new SDownVO("www.baidu.com", "百度", false, 100));

Bundle bundle = new Bundle();
bundle.putInt("Flag", 0);
bundle.putSerializable("start1", (Serializable) list);

intent.putExtra("bundle",bundle);

获取

List<SDownVO> list = (List<SDownVO>) bundle.getSerializable("start1");
list.size();

 

Parcelable 代码

package com.weidingqiang.customnetroid;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by weidingqiang on 15/12/5.
 */
public class PDownVO implements Parcelable {

    private String url;
    private String name;
    private boolean isdown;
    private int percent;

    public PDownVO(){

    }

    public PDownVO(String url,String name,boolean isdown,int percent){
        this.isdown = isdown;
        this.url = url;
        this.name = name;
        this.percent =percent;
    }

    public String getUrl() {
        return url;
    }

    public String getName() {
        return name;
    }

    public boolean isdown() {
        return isdown;
    }

    public int getPercent() {
        return percent;
    }



    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(url);
        dest.writeInt(percent);
        dest.writeByte((byte) (isdown ? 1 : 0));
    }

    public static final Parcelable.Creator<PDownVO> CREATOR  = new Creator<PDownVO>() {
        //实现从source中创建出类的实例的功能
        @Override
        public PDownVO createFromParcel(Parcel source) {
            PDownVO parInfo  = new PDownVO();
            parInfo.name = source.readString();
            parInfo.url= source.readString();
            parInfo.percent = source.readInt();
            parInfo.isdown = (source.readByte()!=0);
            return parInfo;
        }
        //创建一个类型为T,长度为size的数组
        @Override
        public PDownVO[] newArray(int size) {
            return new PDownVO[size];
        }
    };
}

传参

ArrayList<PDownVO> list1 = new ArrayList<PDownVO>();
                list1.add(new PDownVO("www.baidu.com", "百度", false, 100));

                Bundle bundle1 = new Bundle();
                bundle1.putInt("Flag", 1);
                bundle1.putParcelableArrayList("start2", list1);
                intent.putExtra("bundle",bundle1);

获取

ArrayList<PDownVO> list1 =   bundle.getParcelableArrayList("start2");
                list1.size();

 

posted @ 2015-12-05 12:28  weidingqiang  阅读(583)  评论(0编辑  收藏  举报