在android系统中不能直接将非基本类型数据在activities或fragments之间传递,需要将数据序列化然后通过intent或者bundle的putExtra()方法来传递
- 1.什么叫序列化:
将非基本类型的数据对象转换成可存储或可传输的状态
- 2.Serializable( java自带的序列化接口,将对象序列化为二进制数据(字节流))
通过implements Serializable接口(Serializable为标识接口,即无需实现方法)将对象序列化为二进制数据(字节流),可用于包括网络传输等的所有传输方法,以及本地磁盘储存等
- 3.Parcelable (只使用在Android的序列化接口,并没有序列化为二进制数据(字节流))
通过 implements Parcelable接口将一个完整的非基本数据对象分解,分解的每一个部分都是intent所支持的基本数据类型(int
,lang.short,boolean,等)和String类型,主要用来通过intent或bundle在activities或fragments之间传输非基本类型数据对象,不可用于网络传输及磁盘读写储存
- 4.Serializable和Parcelable优缺点对比(一般在Android中两者都能实现功能的情况下,采用Parcelable来序列化数据(效率至上原则))
Serializable
优点:1.序列化为字节流可用于网络传输及磁盘读写(系列化为字节流使用范围广)
2.为标识接口,不需要实现方法代码简单
缺点:1.系统自动完成序列化的过程中会生成许多临时变量,引起频繁的GC
2.效率比较低,花费时间较长
Parcelable
优点:1.效率高,花费时间短,不会产生太多的临时变量
缺点:1.没有序列化为字节流,不能用于网络传输和磁盘读写储存
2.需要实现接口中的方法,代码上稍复杂一点点
- 5.JavaBean实现两种接口的方法
Serializable: 没有方法需要被实现(OS会自动实现序列化)
public class Book implements Serializable {
}
Parcelable:需要实现describeContents()和 writeToParcel()方法,同时在对象中添加一个CREATOR全局变量
public class Person implements Parcelable {
private String name;
private int age;
private String address;
//CREATOR用于Parcel中生成被parcelable的类的一个实例
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
//用于在CREATOR方法中生成被Parcelable的数据的类实例
protected Person(Parcel in) {
//注意属性的顺序与被定义时的必须一致
this.name = in.readString();
this.age = in.readInt();
this.address = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//顺序必须与定义属性时的一致
dest.writeString(name);
dest.writeInt(age);
dest.writeString(address);
}
}
6.通过intent 或Bundle传输两种实现了序列化的对象
Serializable
//intent
Intent intent = new Intent();
intent.putExtra("Key",serializabledObj);//将Serializable对象数据放入intent中
SerializableObj obj = intent.getSerializableExtra("Key")//将Serializable对象从intent中取出
//bundle
Bundle bundle = new Bundle();
bundle.putSerializable("Key",serializabledObj);//将Serializable对象数据放入bundle中
SerializableObj obj = bundle.getSerializable("Key")//将Serializable对象从bundle中取出
Parcelable
//intent
Intent intent = new Intent();
intent.putExtra("Key",parcelabledObj);//将Parcelable对象数据放入intent中
ParcelableObj obj = intent.getParcelableExtra("Key")//将Parcelable对象从intent中取出
//bundle
Bundle bundle = new Bundle();
bundle.putParcelable("Key",parcelabledObj);//将Parcelable对象数据放入bundle中
ParcelableObj obj = bundle.get Parcelable("Key")//将 Parcelable对象从bundle中取出