Android Parcelable vs Serializable
2015-07-09 15:04
645 查看
序列化
在Android中,对象在实现序列化之前是无法直接作为Intent参数在Activity之间传递的。Android中对象序列化可以通过实现Serializable接口或者实现Parcelable接口。接下来,我会介绍一下实现这两个接口的方法以及如何在这两者之间进行选择。
Serializable
Serializable是一个标记接口,意味着它没有需要实现的方法。因为对象再实现Serializable接口的时候,只需要简单的implements即可。示例代码如下:
package com.example.photocrop.model; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class PersonSerializable implements Serializable { private static final long serialVersionUID = -1535959029658501338L; private String name; private String sex; private int age; private List<String> skills = new ArrayList<String>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<String> getSkills() { return skills; } public void setSkills(List<String> skills) { this.skills = skills; } }
在Activity-1中传递PersonSerializable的代码如下:
private PersonSerializable generatePerson() { PersonSerializable ps = new PersonSerializable(); ps.setAge(27); ps.setName("wangzhengyi"); ps.setSex("boy"); ps.setSkills(new ArrayList<String>(Arrays.asList("c", "c++", "java", "php"))); return ps; } private void startActivity2() { PersonSerializable ps = generatePerson(); Intent intent = new Intent(this, Activity2.class); intent.putExtra("person", ps); startActivity(intent); }
在activity-2中接收PersonSerializable对象:
Intent intent = getIntent(); PersonSerializable ps = (PersonSerializable)intent.getSerializableExtra("person"); Log.e("wangzhengyi", "person name :" + ps.getName()); Log.e("wangzhengyi", "persion age :" + ps.getAge());
Parcelable
实现Parcelable接口主要需要如下几个步骤:实现describeContents方法。内容接口描述,默认返回0即可。
实现writeToParcel方法。传递数据到Parcel容器中。
创建一个Parcelable.Creator接口的实例,用于读取Parcel容器中的数据。
示例代码如下:
package com.example.photocrop.model; import java.util.ArrayList; import java.util.List; import android.os.Parcel; import android.os.Parcelable; public class PersonParcelable implements Parcelable{ private String name; private String sex; private int age; private List<String> skills = new ArrayList<String>(); public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<String> getSkills() { return skills; } public void setSkills(List<String> skills) { this.skills = skills; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(getName()); dest.writeString(getSex()); dest.writeInt(getAge()); dest.writeList(getSkills()); } public void readFromParcel(Parcel source) { setName(source.readString()); setSex(source.readString()); setAge(source.readInt()); source.readList(skills, List.class.getClassLoader()); } public static final Parcelable.Creator<PersonParcelable> CREATOR = new Parcelable.Creator<PersonParcelable>() { @Override public PersonParcelable createFromParcel(Parcel source) { // 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。 PersonParcelable pp = new PersonParcelable(); pp.readFromParcel(source); return pp; } @Override public PersonParcelable[] newArray(int size) { // 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。 return new PersonParcelable[size]; } }; }
在activity-1中传递PersonParcelable对象:
private PersonParcelable generatePerson() { PersonParcelable pp = new PersonParcelable(); ps.setAge(27); ps.setName("wangzhengyi"); ps.setSex("boy"); ps.setSkills(new ArrayList<String>(Arrays.asList("c", "c++", "java", "php"))); return pp; } private void startActivity2() { PersonParcelable pp = generatePerson(); Intent intent = new Intent(this, Activity2.class); intent.putExtra("person", ps); startActivity(intent); }
在activity-2中接收PersonParcelable对象:
Intent intent = getIntent(); PersonParcelable pp = (PersonParcelable) intent.getParcelableExtra("person"); Log.e("wangzhengyi", "person name :" + pp.getName()); Log.e("wangzhengyi", "persion age :" + pp.getAge()); for (String skill : pp.getSkills()) { Log.e("wangzhengyi", "skill:" + skill); }
区别
主要的区别如下:Serializable实现简单,不需要任何额外的序列化操作。而Parcelable实现较为复杂,有特定的接口和对象句柄需要实现。
Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC,而相比之下Parcelable的性能更高(号称10倍优于Serializable),所以当在使用内存时(如:序列化对象在网络中传递对象或序列化在进程间传递对象),更推荐使用Parcelable接口。
Parcelable有个明显的缺点:不能使用在要将数据存储在磁盘上的情况(如:永久性保存对象,保存对象的字节序列到本地文件中),因为Parcel本质上为了更好的实现对象在IPC间传递,并不是一个通用的序列化机制,当改变任何Parcel中数据的底层实现都可能导致之前的数据不可读取,所以此时还是建议使用Serializable 。
相关文章推荐
- AndroidStudio使用本地aar包
- EventBus使用详解
- Android Maven pom.xml
- AndroidStudio生成aar包
- android软件更新
- android4.4从系统图库无法加载图片的问题
- 关于onTouchEvent跟OnClickListener冲突的问题
- Android - 文件读写操作 总结
- Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller类详解
- Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
- Android中Preference的使用以及监听事件分析
- Android NFC
- Android它Service
- android post上传文件到服务器
- android style之我的理解
- Android 如何在Launcher桌面创建或者删除快捷图标
- [电子书] 《Android编程兵书》PDF
- android 正则表达式 匹配是否是手机号
- Android腾讯市场应用认领MD5写入空包
- 使用Broadcast实现android组件之间的通信