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 代码
传参
获取
Parcelable 代码
传参
获取
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();
相关文章推荐
- android - SharedPreferences
- Android 关于GridView那些事
- RecyclerView介绍(五)----实现点击效果以及动画
- 百度地图系列04——自定义Marker
- Android Training - 适配不同的屏幕(Lesson 2 - 适配不同屏幕密度)
- Android Training - 适配不同的屏幕(Lesson 1 - 支持不同的屏幕大小)
- Android 的ToggleButton, Spinner和Picker
- Android 清空activity栈的方法
- 关于this.context=context语句
- Android 学习之MeasureSpec类简介
- RecyclerView介绍(四)----实现瀑布流效果
- Android中常用控件分类总结
- Android 自定义属性的使用
- android 各国时区
- Android Training - 创建自定义的Views(Lesson 4 - 优化Views)
- Android Camera开发:扫描二维码,周期性循环自动聚焦auto focus挂掉原因分析(preview is not enabled)
- Android Training - 创建自定义的Views(Lesson 3 - 处理View的交互性)
- Android Training - 创建自定义的Views(Lesson 2 - 自定义Drawing)
- Android Training - 创建自定义的Views(Lesson 1 - 创建一个View类)
- RecyclerView介绍(三)----实现GridView效果