Android 中对数据的序列化处理,有两种方式:
- 实现 Serializable 接口,这时 Java SE 中提供的序列化支持
- 实现 Parcelable 接口,这时 Android 特有的序列化支持
在 Android 中,除了基本类型的数据之外,其他数据只有实现了 Parcelable 接口才可以被放入 Parcel 中。
1. Parcelable 接口定义
public interface Parcelable {
//内容描述接口
public int describeContents();
//写入接口函数,打包
public void writeToParcel(Parcel dest, int flags);
//读取接口,目的是要从 Parcel 中构造一个实现了 Parcelable 的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
在实现这个接口时,要注意以下几点:
- 必须实现 Creator<T> 接口,其中 T 是当前实现类
- Creator<T> 接口的实例必须命名为 CREATOR
- 从 Parcel 实例中读取数据时,必须按照writeToParcel()方法中填写数据的顺序进行读取
2. 示例
首先实现 Parcelable 接口的实现类
public class Student implements Parcelable {
private String name;
private String gender;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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;
}
public boolean isElder() {
return isElder;
}
public void setElder(boolean elder) {
isElder = elder;
}
private boolean isElder;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(gender);
dest.writeInt(age);
dest.writeByte((byte) (isElder ? 1 : 0));
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Student> CREATOR = new Creator<Student>() {
@Override
public Student createFromParcel(Parcel in) {
Student student = new Student();
student.setName(in.readString());
student.setGender(in.readString());
student.setAge(in.readInt());
student.setElder(in.readByte() != 0);
return student;
}
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
}
在要发送数据的页面,封装具体数据
Student student = new Student();
student.setName("karl");
student.setGender("Male");
student.setAge(31);
student.setElder(false);
intent = new Intent(this, TestActivity.class);
intent.putExtra("student", student);
在要接收数据的页面,实现数据的反序列化
Intent intent = getIntent();
Student student = intent.getParcelableExtra("student");
String text1 = student.getName();
String text2 = student.getGender();
int text3 = student.getAge();
boolean text4 = student.isElder();
网友评论