Serializbale接口,Parceable接口可以完成对对象的序列化和反序列化。
把对象转化为字节序列称为对象的序列化
把字节序列转化为对象称为对象的反序列化。
对象的序列化场景:
把一个对象持久化到硬盘上,比如存放到文件中。
在网络上传送对象的字节序列。(android中,就是通过Intent,Binder来传送)
1,Serializbale
Serializbale是Java中的一个序列化接口,是一个空接口。
在类中实现Serializbale接口,那么类的对象就实现了序列化和反序列化。
对象的序列化:
Person person=new Person("ronaldo",24);
try {
ObjectOutputStream obs=new ObjectOutputStream(new FileOutputStream("cache.txt"));
obs.writeObject(person);
} catch (Exception e) {
e.printStackTrace();
}
对象的反序列化:
try {
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("cache.txt"));
Person person=(Person)ois.readObject();
System.out.println(person.toString());
} catch (Exception e) {
e.printStackTrace();
}
serialVersionUID的作用
序列化时,会把serialVersionUID这个值写入到文件中。而在反序列化时,会根据文件的serialVersionUID值和类的serialVersionUID值进行对比,如果一致,反序列化成功,否则反序列化失败。
而如果不写serialVersionUID的值,会根据类的成员生成hash值作为该类的serialVersionUID值。这时,如果改动了类,serialVersionUID值就会发生变化。所以如果不定义serialVersionUID的值,会加大对象反序列失败的概率。
极端情况下,类名或类的构造函数发生了变化,设定了serialVersionUID值,反序列化也会失败。
2,Parcelable
android中提供的序列化接口。
public class Student implements Parcelable{
private String name;
private int age;
private boolean isMale;
//Parcel一些read方法完成反序列化
protected Student(Parcel in) {
name = in.readString();
age = in.readInt();
isMale = in.readByte() != 0;
}
//反序列化是由CREATOR完成
public static final Creator<Student> CREATOR = new Creator<Student>() {
//反序列化,序列化对象----->原始对象
@Override
public Student createFromParcel(Parcel in) {
return new Student(in);
}
//创建指定长度的原始对象数组
@Override
public Student[] newArray(int size) {
return new Student[size];
}
};
//内容描述
//几乎所有的情况下都返回0,只在当前对象中存在文件描述符时,返回1
@Override
public int describeContents() {
return 0;
}
//序列化 原始对象------>序列化对象
//Parcel中包装了可序列化的数据,
//换句话说,数据包装为Parcel对象,就实现了序列化
//它有很多write方法
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeByte((byte) (isMale ? 1 : 0));
}
}
选择哪种序列化的考虑:
Seralizbale序列化,需要进行大量的IO操作,使用简单但开销很大。
Parceable序列化,适用于android平台,使用麻烦但效率高。
Parceable序列化,主要用在内存上的序列化。
将对象序列化到硬盘上或者将对象序列化成字节序列传输到网络上这种序列化,建议使用Seralizbale。