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();

 

转载于:https://www.cnblogs.com/weidingqiang/p/5021347.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值