Serializable、Parcelable区别
1、作用
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
从上面的设计上我们就可以看出优劣了。
2、效率及选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
3、编程实现
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。
Parcelable的一个实现例子如下
实现代码如下:
public class PersonSer_serializablebean implements Serializable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }2)ParcelableBean:
public class PersonSer_parcelablebean implements Parcelable{ private String name; private int age; @Override public void writeToParcel(Parcel dest, int flags) { //该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存, // 以便从parcel容器获取数据 dest.writeString(name); dest.writeInt(age); } @Override public int describeContents() { return 0; } public static final Creator3)JsonBean:CREATOR = new Creator () { @Override public PersonSer_parcelablebean createFromParcel(Parcel in) { //从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。 PersonSer_parcelablebean parcelablebean = new PersonSer_parcelablebean(); parcelablebean.name=in.readString(); parcelablebean.age=in.readInt(); return parcelablebean; } @Override public PersonSer_parcelablebean[] newArray(int size) { //创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。 return new PersonSer_parcelablebean[size]; } }; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class PersonSer_Jsonbean{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
activity中:
发送部分
public static final String SER_TYPE="1" ; public static final String SER_KEY="1" ; public static final String PAR_TYPE="2"; public static final String PAR_KEY="2"; public static final String JSON_TYPE="3";
// Intent数据传递方式Serializable、Parcelable、json Intent intent = new Intent(this,DataTransferActivity.class); Bundle bundle = new Bundle(); switch (item.getItemId()) { case R.id.Serializable: // Serializable传递对象 PersonSer_serializablebean personSer_serializablebean = new PersonSer_serializablebean(); personSer_serializablebean.setName("liusheng"); personSer_serializablebean.setAge(18); bundle.putSerializable(SER_KEY,personSer_serializablebean); intent.putExtra("type", SER_TYPE); intent.putExtras(bundle); startActivity(intent); break; case R.id.Parcelable: // Parcelable传递对象 PersonSer_parcelablebean personSerParcelablebean = new PersonSer_parcelablebean(); personSerParcelablebean.setName("panxingxing"); personSerParcelablebean.setAge(18); bundle.putParcelable(PAR_KEY,personSerParcelablebean); intent.putExtra("type",PAR_TYPE); intent.putExtras(bundle); startActivity(intent); break; case json: //JSON传递对象 PersonSer_serializablebean personSerSerializablebean = new PersonSer_serializablebean(); personSerSerializablebean.setName("bingbing"); personSerSerializablebean.setAge(18); intent.putExtra("person",new Gson().toJson(personSerSerializablebean)); intent.putExtra("type",JSON_TYPE); startActivity(intent); break; }接收部分
String type = getIntent().getStringExtra("type"); // 根据type判断是哪种类型 if (type.equals(brandActivity.SER_TYPE)) { PersonSer_serializablebean personSer_serializablebean = (PersonSer_serializablebean) getIntent().getSerializableExtra(brandActivity.SER_KEY); readName.setText(personSer_serializablebean.getName()); readAge.setText(String.valueOf(personSer_serializablebean.getAge())); }else if(type.equals(brandActivity.PAR_TYPE)){ PersonSer_parcelablebean parcelablebean = getIntent().getParcelableExtra(brandActivity.PAR_KEY); readName.setText(parcelablebean.getName()); readAge.setText(String.valueOf(parcelablebean.getAge())); }else{ String personJson=getIntent().getStringExtra("person"); PersonSer_serializablebean personSerSerializablebean=new Gson().fromJson(personJson,PersonSer_serializablebean.class); readName.setText(personSerSerializablebean.getName()); readAge.setText(String.valueOf(personSerSerializablebean.getAge())); }