序列化使用场景
- 通过Intent 或者 Binder 传输数据时
- 将对象持久化到设备上
序列化类
- serializable (java.io.Serializable)
- parcelable (android.os.Parcelable)
Serialzable使用示例:
public class Book implements Serializable{
private static final long serialVersionUID = 1L;
public int id;
public String name;
public Book(){
}
public Book(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
直接继承serializable 即可,同时设置serialVersionUID。用法相对parcelable 简单很多。
serialVersionUID作用主要体现如下:
- 序列化时会同时将serialVersionUID保存到本地,在进行反序列化的时候会去检测序列化文件的serialVersionUID是否和反序列化对象的serialVersionUID相同,如果一致则可进行反序列化。
- Book 类中增添或者是删减属性都是没有问题,依然可以正常反序列化
- Book 类中如果修改属性的类型,在进行反序列化会报错。
- 如果不设置serialVersionUID的时候增添或者删减属性反序列话都会报错。
序列化,反序列化 示例:
Book mBook;
//反序列化
public void unSerial(View view) throws IOException, ClassNotFoundException {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filepath));
try{
while (true) {
mBook = (Book) inputStream.readObject();
Log.e(TAG, mBook.toString());
}
}catch (EOFException e){
}
inputStream.close();
}
//序列化
public void serial(View view) throws IOException {
Book book = new Book(1, "android 艺术开发");
Book book1 = new Book(1, "java");
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filepath));
outputStream.writeObject(book);
outputStream.writeObject(book1);
outputStream.close();
}
注意反序列化获取多个Object是通过EOF异常判断的
Parcelable 使用示例:
public class People implements Parcelable {
public int age;
public String name;
public People(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.age);
dest.writeString(this.name);
}
protected People(Parcel in) {
this.age = in.readInt();
this.name = in.readString();
}
public static final Parcelable.Creator<People> CREATOR = new Parcelable.Creator<People>() {
public People createFromParcel(Parcel source) {
return new People(source);
}
public People[] newArray(int size) {
return new People[size];
}
};
}
同样也是继承Parcelable,不过复写的方法明显要比serialable要多,这个复写的方法我一般怎么管过,都是使用androidStudio自带的插件生成的,所以虽然复写的方法要多,但是其实比serilizable要麻烦不到哪去。
插件 Android Parcelable code generator
安装插件路径示例图:
Serializable 和 Parcelable 哪个好?
serializable 是java 包下的类,而Parcelable 则是android 下,在android进行数据之间传递时如Intent这个时候是在内存中,使用parcelable会更加高效,Seriablizable会进行大量的io操作效率会低一些。但是进行序列化到本地这种操作的时候还是使用Serializable较好。