一、定义
- 实现serializable是java原生的序列化的方式
- parcelable是Android上特有的用于将对象序列化的一个接口
二、为什么要使用序列化呢
1、在我们平时的开发中,少不了在组件间以及不同界面中传递数据,对于复杂数据类型,比如对象我们需要将其序列化来达到可存储可传输的目的
三、实践两种序列化方法传递对象
1、实现Serializable接口序列化对象
实现Serializable接口的Student类
public class Student implements Serializable{
private String name;
private int age;
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
使用intent传递对象
Student student = new Student();
student.setAge(18);
student.setName("张三");
intent.putExtra("student", student);
从intent中得到student对象
Intent intent = getIntent();
Student student = (Student) intent.getSerializableExtra("student");
2、实现parcelable接口序列化
实现Parcelable的student类
public class Student implements Parcelable{
private String name;
private int age;
public Student() {
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/** ---------------------Parcelable need--------------------------- */
protected Student(Parcel in) {
age = in.readInt();
name = in.readString();
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel in) {
return new Student(in);
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);
dest.writeString(name);
}
}
intent传递
Student student = new Student();
student.setAge(18);
student.setName("张三");
intent.putExtra("student", student);
在SecondActivity中
Intent intent = getIntent();
Student student = intent.getParcelableExtra("student");
四、总结
系统自动帮我们做了需要的操作
- 主要是readXXX()方法读取;
- writeXXX()方法写入;
- 两种方式都可以将对象序列化后传递 但是在Android中建议使用 Parcelable对对象进行序列化
它的效率是serializable的十倍以上;因为serializable在序列化的过程中使用到了反射,这是很耗时的,并且会产生很多的临时变量,这将导致频繁GC;而parcelable实质上是将对象分解进行传递,分解后的每一部分都是intent所支持的普通数据类型;
- 如果需要将对象进行持久化存储,建议使用serializable,即使效率要低;因为parcelable在外界有变化的情况下不能保证数据的的持续性;
- 比起serializable,parcelable使用要麻烦些 代码量会更多,但这并不影响我们使用它,毕竟效率杠杠的。
网友评论