您的位置:首页 > 移动开发 > Android开发

Android Parcelable和Serializable的区别

2015-12-05 12:28 537 查看
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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: