版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kikitious_Du/article/details/78803082
Serializable
如何实现
只需要实现Serializable接口并在类中声明serialVersionUID即可
public class Student implements Serializable {
//serialVersionUID,用来保证正常反序列化
private static final long serialVersionUID = -6396556582748912833L;
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
serialVersionUID的工作机制
系列化时,系统会把当前类的serialVersionUID写入序列化的文件中,当反序列化时,系统就会检测文件中的serialVersionUID,看是否和当前类的serialVersionUID相同,相同就说明序列化的类的版本和当前类的版本是相同的,这时可以成功反序列化。
Parcelable
如何实现
Parcelable实现分为三步,序列化、内容描述、反序列化,如下所示
public class Teacher implements Parcelable {
private String name;
private int age;
private Subject subject;
public Teacher(String name, int age, Subject subject) {
this.name = name;
this.age = age;
this.subject = subject;
}
//反序列化
protected Teacher(Parcel in) {
name = in.readString();
age = in.readInt();
//这里的subject是另一个可序列化的对象,故反序列化需要传递当前线程的上下文类加载器
subject = in.readParcelable(Thread.currentThread().getContextClassLoader());
}
//反序列化
public static final Creator<Teacher> CREATOR = new Creator<Teacher>() {
@Override
public Teacher createFromParcel(Parcel in) {
return new Teacher(in);
}
@Override
public Teacher[] newArray(int size) {
return new Teacher[size];
}
};
//内容描述
@Override
public int describeContents() {
return 0;
}
//序列化
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeParcelable(subject, 0);
}
}
Serializable和Parcelable的区别
● Serializable是Java中的序列化接口;Parcelable是Android中的序列化接口
● Serializable使用简单,但开销大;Parcelable使用麻烦,但效率高
● Serializable使用场景:将对象序列化到存储设备中 或 将对象序列化后通过网络传输;Parcelable使用场景:内存序列化
参考:《Android开发艺术探索》