1.概述
序列化:将内存中的java对象转换为字节序列并存储在本地。
反序列化:将本地的字节序列转换为java对象。
2.android中序列化的方式:
-
Serializable
:java中一直存在的序列化接口声明,类似于Cloneable只做声明标记使用,没有方法声明。要将序列化对象所属类实现Serializable接口,可以将对象保存到本地磁盘文件中。
public class Person implements Serializable {
/*不要更改序列化id,
*反序列化时需要用到比对序列化的对象与实际对象的id是否相同,不同会抛出
序列化失败异常。*/
private static final long serialVersionUID = 1L;
private String name;
private int age;
}
- Parcelable:android特有的传输效率高,常用于程序间或者进程间的数据传递,不可以将对象保存到本地磁盘中,若想保存到本地磁盘文件中还是要使用Serializable。
public class Student implements Parcelable {
private String name;
private int age;
/*
* 1.transient修饰的属性不会序列化
* 2.static修饰的属性也不会序列化,静态属性是属于类的不属于对象。
*/
private transient int level=2;
private static final String className="1年级";
protected Student(Parcel in) {
name = in.readString();
age = in.readInt();
}
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];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
}
3.序列化方式对比:
序列化方式 | 实现方式 | 传输效率 | 可否在磁盘文件保存 | 使用场景 |
---|---|---|---|---|
Serializable | ObjectoutStream/ObjectInputStream | 低 | 可以 | 序列化本地磁盘 |
Parcelable | android特有 | 高 | 否 | 程序间/进程间比如ipc |
4.注意点:
在使用的时候优先使用效率高的Parceable,Serializable在序列化使用的是对象输入流和对象输出流本身是一次IO操作,伴随着中间会产生大量的临时对象,会造成GC频繁的内存回收。
如果需要将java对象的字节序列保存在磁盘文件的需求,Parceable不能保存在磁盘中,只能使用Serializable了。
//在intent中数据传递的使用
Intent intent=new Intent();
intent.putExtra("name",data);
intent.getSerializableExtra("name");
intent.getParcelableExtra("name");
网友评论