1.什么场景中会使用到Serializable和Parcelable?
答:在进行Intent跳转,需要传递对象到下一个Activity中时候。直接写intent.putExtra()会报错,这时候会提示我们需要将类转换成Serializable和Parcelable
2.你会选择哪个呢?
答:平时我一定选择Serializable。因为它实现很方便,只需要implements Serializable即可(但这是错误的做法,下面会介绍什么情况用哪个)
3.Serializable使用方法:
public class UserBean implements Serializable{
private int no;
private String name;
private String sex;
public UserBean(int no, String name, String sex) {
this.no = no;
this.name = name;
this.sex = sex;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
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;
}
@Override
public String toString() {
return "UserBean{" +
"no=" + no +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
(1)传递对象
传值部分:
UserBean userBean=new UserBean(1,"小彩虹","男");
Intent intent = new Intent(SendActivity.this, SerializableActivity.class);
intent.putExtra("bean",userBean);
startActivity(intent);
接收部分:
Intent intent = getIntent();
UserBean userBean = (UserBean) intent.getSerializableExtra("bean");
(2)传递集合
传值部分:
UserBean userBean=new UserBean(1,"小彩虹","男");
List<UserBean> userBeanList=new ArrayList<UserBean>();
userBeanList.add(userBean);
Intent intent = new Intent(SendActivity.this, SerializableActivity.class);
intent.putExtra("beanList", (Serializable) userBeanList);
startActivity(intent);
接收部分:
Intent intent = getIntent();
List<UserBean> userBeanList = (List<UserBean>) intent.getSerializableExtra("beanList");
4.Parcelable使用方法:
public class StudentBean implements Parcelable {
private int no;
private String name;
private String sex;
public StudentBean(int no, String name, String sex) {
this.no = no;
this.name = name;
this.sex = sex;
}
public StudentBean(Parcel source) {
//顺序要和writeToParcel方法中顺序一致
no = source.readInt();
name = source.readString();
sex = source.readString();
}
public static final Creator<StudentBean> CREATOR = new Creator<StudentBean>() {
@Override
public StudentBean createFromParcel(Parcel in) {
return new StudentBean(in);
}
@Override
public StudentBean[] newArray(int size) {
return new StudentBean[size];
}
};
@Override
public int describeContents() {
//这里默认返回0即可
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
//顺序要和构造方法中顺序一致
parcel.writeInt(no);
parcel.writeString(name);
parcel.writeString(sex);
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
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 static Creator<StudentBean> getCREATOR() {
return CREATOR;
}
@Override
public String toString() {
return "StudentBean{" +
"no=" + no +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}
(1)传递对象
传值部分:
StudentBean studentBean = new StudentBean(2,"danny","女");
Intent intent = new Intent(SendActivity.this, ParcelableActivity.class);
intent.putExtra("bean",studentBean);
startActivity(intent);
接收部分:
Intent intent = getIntent();
StudentBean studentBean = intent.getParcelableExtra("bean");
(2)传递集合
传值部分:
StudentBean studentBean = new StudentBean(2,"danny","女");
List<StudentBean> studentBeanList=new ArrayList<StudentBean>();
studentBeanList.add(studentBean);
Intent intent = new Intent(SendActivity.this, ParcelableActivity.class);
intent.putParcelableArrayListExtra("beanList", (ArrayList<? extends Parcelable>) studentBeanList);
startActivity(intent);
接收部分:
Intent intent = getIntent();
List<StudentBean> studentBeanList = intent.getParcelableArrayListExtra("beanList");
如上我们分别实现了Serializable和Parcelable接口
总结篇:
到底为什么要使用序列化
将对象转换成可传输或者可存储的状态。序列化后的对象可以传输或者存储到本地
Serializable的简介
Java自带,原理是将对象转换成可存储或可传输的状态
缺点:
由于使用了反射的原理,序列化的时候会产生大量的临时变量,消耗比较大
优点:
a.打码量少,用起来很方便
b.虽然效率低了点,但是可以保证数据的持久性和稳定性,所以在做存储时,例如存储到文件,还是需要这种方式
Parcelable的简介
是将完整对象进行分解
,分解后的每个部分都是Intent所支持的数据类型
重写的describeContents(): 内容接口描述,默认返回0即可
重写的writeToParcel():该方法负责序列化,这里注意顺序要和读的顺序保持一致
构造函数:这里相当于反序列化。注意要和写的顺序保持一致。同时会生成一个实例化静态内部对象CREATOR,这里传入了构造函数需要的Parcel
缺点:
a.实现起来较为复杂,增大了代码量
b.只能对内存对象序列化,不能对需要存储在文件或SD等设备进行序列化,如果需要将对象序列化存储到文件,需要使用Serializable
优点:
a.代码编译速度是Serializable的十倍
,所以我们需要尽可能使用Parcelable。尤其是在传递集合,集合的泛型实体bean中还嵌套实体bean的情况
在使用场景中,由此可见,大部分情况我们需要使用Parcelable,而存储的时候使用Serializable更好
网友评论