用途:当我们需要用到intent传值的时候,会发现Intent.putExtra()方法中并没用对应的重载方法去传入一个对象,而包含了如下的两个重载方法
Intent.putExtra(String,Parcelable) 和 Intent.putExtral(String,Serializable)方法,
所以Parcelable和Serializable就是我们实现对象序列化的两种方式,也即是为了达到intent传入一个对象
1,Serializable
实现Serializable方式只需要让对象实现Serilalizable接口即可
<span style="font-family:Microsoft YaHei;">public class Student implements Serializable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
</span>
这是我们只需要在intent传值中分别使用以下方法进行传入和获取
<span style="font-family:Microsoft YaHei;"> intent.putExtra("student", student);//传入</span>
<span style="font-family:Microsoft YaHei;">Student s = (Student) intent.getSerializableExtra("student");//获取</span>
2,Parcelable
Parcelable实现比较麻烦,主要分为以下几步:
1 )当前对象实现Parcelable接口,包含两个必要的方法describeContents()和writeToParcel(Parcel dest, int flag)。
-- describeContents()方法无需做任何处理,直接返回0即可。
-- wirteToParcel()方法中通过dest参数的writeString()和writeInt()方法,将对应字段写入。
2 )创建一个静态Parcelable.Creator<需要序列化的对象名> 对象,并实现该接口。该接口中包含两个方法,
-- createFromParcel(Parcel source)方法,该方法返回我们需要序列化的对象。我们该该方法中创建对象,并通过参数source的read方法获取对应字段值并赋值返回。
-- newArray(int size)方法,该方法没有太大区别,直接new出一个序列化对象数组返回即可
代码示例:
<span style="font-family:Microsoft YaHei;">public class Person implements Parcelable{
private String name;
private String age;
private String sex;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flag) {
dest.writeString(name);
dest.writeString(age);
dest.writeString(sex);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
Person person = new Person();
person.name = source.readString();
person.age = source.readString();
person.sex = source.readString();
return person;
}
@Override
public Person[] newArray(int size) {
return new Person[size] ;
}
};
}</span>
使用方式与Serializable的使用类似
<span style="font-family:Microsoft YaHei;">intent.putExtra("person", person);//传入</span>
<span style="font-family:Microsoft YaHei;">intent.getParcelableExtra("person");//获取</span>
两者对比
1)实现方式上Serializable比Parcelable更简单
2)效率上,Parcelable更优。推荐使用Parcelable