文章目录

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??? 方法读出来的数据。