Android 中Serializable与Parcelable区别?

两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
Serializable不是当前关注的焦点,不过可以查看《Java序列化算法透析》这篇文章中实现一个简单的Serializable例子,查看序列化生成的IO文件,并且以16进制读取并一一解释每一个16进制数字的含义。

Parcelable举例:

public class MyParcelable implements Parcelable {  
     private int mData;  
     private String mStr;  
  
     public int describeContents() {  
         return 0;  
     }  
  
     // 写数据进行保存  
     public void writeToParcel(Parcel out, int flags) {  
         out.writeInt(mData);  
         out.writeString(mStr);  
     }  
  
     // 用来创建自定义的Parcelable的对象  
     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();  
         mStr = in.readString();  
     }  
 }  

   

 //Pacelable传递对象方法  
    public void PacelableMethod(){  
        Book mBook = new Book();  
        mBook.setBookName("Android Tutor");  
        mBook.setAuthor("Frankie");  
        mBook.setPublishTime(2010);  
        Intent mIntent = new Intent(this,ObjectTranDemo2.class);  
        Bundle mBundle = new Bundle();  
        mBundle.putParcelable(PAR_KEY, mBook);  
        mIntent.putExtras(mBundle);  
          
        startActivity(mIntent);  
    }  

如果元素是list读出时需要先new一个ArrayList传入,否则会报空指针异常。如下:

list = new ArrayList<String>();

in.readStringList(list);

 //Serializeable传递对象的方法  
    public void SerializeMethod(){  
        Person mPerson = new Person();  
        mPerson.setName("frankie");  
        mPerson.setAge(25);  
        Intent mIntent = new Intent(this,ObjectTranDemo1.class);  
        Bundle mBundle = new Bundle();  
        mBundle.putSerializable(SER_KEY,mPerson);  
        mIntent.putExtras(mBundle);  
          
        startActivity(mIntent);  
    }  

猜你喜欢

转载自jishudaren.iteye.com/blog/2297513