轉載請標明出處 :http://www.javashuo.com/article/p-tueswqxj-hg.html html
Parcelable與Serializableandroid
Serializable是Java爲咱們提供的一個標準化的序列化接口。網絡
Parcelable是Android爲咱們提供的序列化的接口。ide
對比:this
一、Parcelable相對於Serializable的使用相對複雜一些。spa
二、Parcelable的效率相對Serializable也高不少。code
三、Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable在外界有變化的狀況下不能很好的保證數據的持續性。儘管Serializable效率低點,但此時仍是建議使用Serializable。存儲到設備或者網絡傳輸上選擇Serializable。htm
序列化與反序列化對象
序列化:將對象轉換爲能夠傳輸的二進制流(二進制序列)的過程,這樣咱們就能夠經過序列化,轉化爲能夠在網絡傳輸或者保存到本地的流(序列),從而進行傳輸數據 。blog
反序列化:從二進制流(序列)轉化爲對象的過程。
簡單使用:
進行Android開發的時候,沒法將對象的引用傳給Activities或者Fragments,咱們須要將這些對象放到一個Intent或者Bundle裏面,而後再傳遞。簡單看一下:
一、定義Book類,實現Parcelable接口。
package com.status.mattest; import android.os.Parcel; import android.os.Parcelable; public class Book implements Parcelable { private String name; private int id; private String classify; protected Book(Parcel in) { name = in.readString(); classify = in.readString(); id = in.readInt(); } public Book(String classify, String name, int id) { this.name = name; this.id = id; this.classify = classify; } /** * 反序列化 */ public static final Creator<Book> CREATOR = new Creator<Book>() { @Override public Book createFromParcel(Parcel in) { return new Book(in); } @Override public Book[] newArray(int size) { return new Book[size]; } }; @Override public int describeContents() { return 0; } /** * 序列化過程 * * @param dest * @param flags */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(classify); dest.writeInt(id); } @Override public String toString() { return "name : " + name + "\"" + "id : " + id + "\"" + "classify" + classify; } }
writeToParcel:序列化過程
Creator與protected Book(Parcel in)配合實現反序列化,轉換爲對象。
注意:類中有多個String或者其它相同對象的話,那麼writeToParcel中writeString的順序是怎麼樣的,protected Book(Parcel in) {}中readString的順序就得是怎麼樣的。
二、mainActivity中:
textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Test1Activity.class); intent.putExtra("key", new Book("哈", "鴻", 8)); startActivity(intent); } });
三、另外一個Activity獲取:
Intent intent = getIntent(); Book book = intent.getParcelableExtra("key"); Log.d("Test1Activity", book.toString());
輸出:
Book類裏面有其它對象:
若是Book類裏面有其餘對象(好比實體類Data)的話,那麼Data也須要實現Parcelable接口,用法與上面的Book類同樣。
writeToParcel裏面須要寫上:dest.writeParcelable(data, 0);
protected Book(Parcel in) {}裏面須要寫上data = in.readParcelable(Data.class.getClassLoader());