Serializable与Parcelable

来源:互联网 发布:linux查看宕机 编辑:程序博客网 时间:2024/06/05 18:30



            我们在传输数据的时候经常会碰到想传输对象或者一些除了基础类型以外的类型,如果我们想直接通过intent传输的话是无法成功的,我们必须先给这个对象进行序列化之后,他才能传输,然后接受方通过反序列化把他接收并解析出来,像前面说到的进程间的通信,数据传输都必须实现序列化才能被传输。


           对象的序列化Java里面一般用的是 Serializable接口Serializable接口的使用十分简单,只要对象承接这个接口就可以了。当然安卓里面也可以用这个接口来实现对象的序列化。但是Serializable接口效率稍微差点,因为实际上他的原理就是序列化的时候把对象存进文件(利用ObjectOutputStream),反序列化的时候就是从文件里吧这个文件取出(利用ObjectInputStream),所以实际上涉及大量的I/O操作,所以效率较低。


       但是安卓里同时提供了另一个实现序列化的接口,叫做Parcelable接口效率比实现Serializable接口高。但是实现起来相较于Serializable接口来说相对复杂些,下面贴一个例子,关于Oarcelable接口的使用:


     先看一下Parcelable这个接口里面的内容:

     

  1. public interface Parcelable {  
  2.     //内容描述(不是很重要)  
  3.     public int describeContents();  
  4.     //打包,把对象写入包内 
  5.     public void writeToParcel(Parcel dest, int flags);  
  6.      //读取接口
  7.     public interface Creator<T> {  
  8.            public T createFromParcel(Parcel source);  
  9.            public T[] newArray(int size);  
  10.        }  


所以我们的对象承接了Parcelable接口后基本就是要实现上面几个接口方法,看一个例子:

  1. public class Car implements Parcelable{  
  2.        
  3.      // 这是成员变量  
  4.      private int id;  
  5.      private String color;  
  6.         
  7.        
  8.      public int getId() {  
  9.          return id;  
  10.      }  
  11.    
  12.      public void setId(int id) {  
  13.          this.id = id;  
  14.      }  
  15.    
  16.      public String getColor() {  
  17.          return color;  
  18.      }  
  19.    
  20.      public void setColor(String color) {  
  21.          this.color = color;  
  22.      }  


  1.       // 这个接口实现了从Percel容器读取Person数据,并返回Person对象给逻辑层使用  
  2.       //实现了反序列化
  3.      public static final Parcelable.Creator<Person> CREATOR = new Creator(){  
  4.    
  5.          @Override  
  6.          public Person createFromParcel(Parcel source) {  
  7.              // TODO Auto-generated method stub  
  8.              // 必须按成员变量声明的顺序读取数据,不然获取数据的时候会出错  
  9.              Person p = new Person();  
  10.              p.setId(source.readInt());  
  11.              p.setName(source.readString());  
  12.              return p;  
  13.          }  
  14.    
  15.          @Override  
  16.          public Person[] newArray(int size) {  
  17.             
  18.              return new Person[size];  
  19.          }  
  20.      }; 

  1.    
  2.      @Override  
  3.      public int describeContents() {  
  4.          // TODO Auto-generated method stub  
  5.          return 0;  
  6.      }  
  7.    
  8.     //实现了序列化
  9.      @Override  
  10.      public void writeToParcel(Parcel dest, int flags) {  
  11.           
  12.          // 必须按成员变量声明的顺序封装数据,不然会出现获取数据出错  
  13.          // 序列化对象  
  14.          dest.writeInt(id);  
  15.          dest.writeString(color);  
  16.      }  
  17.  }  


    对比:

     以上就是Serializable接口和Parcelable接口的基本用法,其中Serializable接口用起来简单但是开销大,序列化和反序列化需要大量的I/O操作;而Parcelable接口是Android特有的序列化接口,他用起来下位复杂但是效率高,因此在安卓开发中推荐使用Parcelable接口。


0 0
原创粉丝点击