Parcelable 与Serializable(两种序列化方式用于传输非基本类型的数据)

在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 CREATOR = new Creator() {
        @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中取出

你可能感兴趣的:(Parcelable 与Serializable(两种序列化方式用于传输非基本类型的数据))