天天看点

Android中的Serializable、Parcelable

​Parcelable​

这是一个接口,它的实例可以写入​

​Parcel​

​​或从​

​Parcel​

​​恢复。实现​

​Parcelable​

​​的类必须要有一个实现了​

​Parcelable.Creator​

​​接口的类型的非空静态字段​

​CREATOR​

​​,这个字段是帮忙从一个​

​Parcel​

​​产生一个​

​Parcelable​

​类的实例。

public class MyParcelable implements Parcelable {
     private int mData;

     public int describeContents() {
         return 0;
     }

     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }

     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };

     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }      
  • describeContents()用于描述​

    ​Parcelable​

    ​类实例的
  • writeToParcel(Parcel dest, int flags)用于将数据扁平化写入​

    ​Parcel​

​Parcel​

​​是一个消息(数据或对象引用)容器,它可以通过​

​IBinder​

​​来发送,也就是说 ​

​Parcelable​

​实例十分合适作来进程间通信的消息载体。

在​

​java​

​​中使用​

​Serializable​

​​接口实现对象的序列化,而在android中既可以使用​

​Serializable​

​​也可以使用​

​Parcelable​

​​接口实现对象序列化,如果只在内存操作时则倾向​

​Parcelable​

​接口,传输效率会更高效。

注意:​

​Parcelable​

​​只能对内存对象序列化,不能对需要存储在文件或SD等设备进行序列化,如果需要将对象序列化存储到文件,实现​

​Serializable​

​接口就可以了

​Serializable​

​​是​

​java​

​​提供的一个序列化接口,它是一个空接口,专门为对象提供标准的序列化和反序列化操作,用它实现类的序列化比较简单,只要在类声明中实现​

​Serializable​

​接口即可。

public class User implements Serializable {
    private static final long serialVersionUID = -4454266436543306544L;

    private String name;
    /**
     * age
     */
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}      

由于​

​serialVersionUID​

​​是用来辅助序列化和反序列化过程的,原则上序列化后的对象中​

​serialVersionUID​

​​只有和当前类的​

​serialVersionUID​

​​相同才能够正常被反序列化,也就是说序列化与反序列化的​

​serialVersionUID​

​​必须相同才能够使序列化操作成功。序列化操作的时候系统会把当前类的​

​serialVersionUID​

​​写入到序列化文件中,当反序列化时系统会去检测文件中的​

​serialVersionUID​

​​,判断它是否与当前类的​

​serialVersionUID​

​​一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败。因此强烈建议指定​

​serialVersionUID​

​​,这样的话即使微小的变化也不会导致crash的出现,否则文件多一个空格或类的结构有些许变化都会反序列化失败。默认情况下,系统会根据类结构自动生成的​

​serialVersionUID​

​​,因此当类稍有变化,自动生成的UID就会与之前存在文件中的不一样,就会反序列化失败。因此有必要指定​

​serialVersionUID​

​,那么系统就会尽可能地序列化。