文章目录
  1. 1. 区别
  2. 2. 实现

序列化是为了将对象转换成字节序列保存到本地或者在网络中、进程或Activity间传递对象。

Android中自定义的对象序列化可以选择Parcelable或者Serializable来解决。

区别

  1. 在使用内存时,Parcelable比Serializable的性能高
  2. Serializable在序列化的过程中产生大量的临时变量,从而引起频繁的GC
  3. Parceable不能使用在数据存储在磁盘的情况
  4. Serialzable接口是Java SE支持的,Parcelable是Android特有的功能

实现

  • Serializable的实现与使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public class Box implements Serializable
    {
    private int width;
    private int height;

    public void setWidth(int width){
    this.width = width;
    }

    public void setHeight(int height){
    this.height = height;
    }

    public static void main(String[] args){
    Box box = new Box();
    box.setWidth(50);
    box.setHeight(30);
    try{
    FileOutputStream fs = new FileOutputStream("foo.ser");
    ObjectOutputStream os = new ObjectOutputStream(fs);
    os.writeObject(myBox);
    os.close();
    }catch(Exception ex){
    ex.printStackTrace();
    }
    }
    }
  • Parcelable
    实现Parcelable接口的实例,可以将自身的数据信息写入一个Parcel对象,也可以从Parcel中恢复到对象的状态。
    Parcel提供了一系列的方法帮助写入数据与读取数据

  1. obtain():在池中获取一个新的Parcel
  2. dataSize():得到当前Parcel对象的实际存储空间
  3. dataPosition():获取当前Parcel对象的偏移量
  4. setDataPosition():设置当前Parcel对象的偏移量
  5. recyle():清空、回收当前Parcel对象的内存
  6. writeXxx():向当前Parcel对象写入数据,具有多种重载
  7. readXxx():从当前Parcel对象读取数据,具有多种重载
    简而言之,Parcelable通过writeToParcel()方法,对复杂对象的数据写入Parcel的方法进行对象序列化,需要的时候,通过定义的静态属性CREATOR.createFromParcel()进行反序列化的操作。Parcelable对Parcel进行包装,其内部就是通过Parcel进行序列化与反序列化
  • 实现Parcelable接口
    Parcelable必须要实现的抽象方法:
    • abstract int describeContents():返回一个位掩码,表示一组特殊对象类型的Parcelable,一般返回0即可
    • abstract void writeToParcel(Parcel dest,int flags):实现对象的序列化,通过Parcel的一系列writeXxx()方法序列化对象
    • abstract T createFromParcel(Parcel source):通过source对象,根据writeToParcel()方法序列化的数据,反序列化一个Parcelable对象
    • abstract T[] newArray(int size):创建一个新的Parcelable对象的数组
      类中定义一个名为CREATOR类型为Parcelable.Create的泛型静态属性,实现对象的反序列化
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      @Override
      public int describeContents() {
      return 0;
      }
      @Override
      public void writeToParcel(Parcel dest,int flags) {
      // 序列化
      dest.writeInt(id);
      dest.writeString(msgText);
      dest.writeString(fromName);
      dest.writeString(fromName);
      dest.writeString(date);
      }
      @Override
      public static final Parcelable.Creator<Message> CREATOR = new Creator<Message>() {
      @Override
      public Message[] new Array(int size){
      return new Message[size];
      }
      @Override
      public Message createFromParcel(Parcel source){
      // 反序列化 顺序要与序列化时相同
      return new Message(source.readInt(),source.readString(),source.readString()source.readString());
      }
文章目录
  1. 1. 区别
  2. 2. 实现