Serializable
Serializable实现序列化的接口
例如:
只要实现这个接口,系统会自动完成序列化,效率较低
public class Music implements Serializable{
public String title;
public String artist;
public int duration;
}
Music music = new Music();
music.title = "";
music.artist = "";
music.duration = 123;
//传递数据
Intent intent = new Intent(this,DetailActivity.class);
intent.putExtra("music",music);
startActivity(intent);
//获取数据
Intent intent = getIntent();
Music music = (Music) intent.getSerializableExtra("music");
Parcelable
而Parcelable是Android系统中的序列化接口,实现该接口的类必须是显示的确定类的成员将如何被序列化
栗子
这个栗子是在【达内课程】Intent在Android系统的作用这篇文章的传递数据的栗子的基础上进行的
在第一个Activity中传递username、age、gender到第二个Activity
我们把要传递的数据封装成一个Person类
Person
public class Person{
public String username;
public String gender;
public int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
我们修改刚才的Person类,首先实现Parcelable接口,按照提示,重写方法,并创建CREATOR,需要自己写一个有参的构造方法
public class Person implements Parcelable {
private String username;
private String gender;
private int age;
protected Person(Parcel in) {
username = in.readString();
gender = in.readString();
age = in.readInt();
}
public Person(String username, String gender, int age) {
this.username = username;
this.gender = gender;
this.age = age;
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(username);
parcel.writeString(gender);
parcel.writeInt(age);
}
}
MainActivity传递数据时
Person person = new Person(username,gender,age);
Intent intent = new Intent(this,SecondActivity.class);
intent.putExtra("person",person);
startActivity(intent);
SecondActivity接收数据时
Person person = getIntent().getParcelableExtra("person");
Log.d("Intent","姓名:"+person.getUsername()+" 性别:"+person.getGender()+" 年龄:"+person.getAge());
总结
Parcelable 是 Android 系统中的序列化接口,实现该接口的类必须显示的确定类的成员将如何被序列化。
实现 Parcelable 接口除了需要重写接口中定义的 2 个抽象方法外,还需要声明 public static final Parcelable.Creator<T> CREATOR
属性,并在创建该属性的对象时,实现 Parcelable.Creator 接口中的 2 个抽象方法。
在实现 Parcelable 接口的过程中,必须保证读写顺序的一致,即先调用 write??? 方法写入数据,一定是先通过 read??? 方法读出来的数据。