淺談Android中Serializable和Parcelable使用區別
Android中序列化有兩種方式:Serializable以及Parcelable。其中Serializable是Java自帶的,而Parcelable是安卓專有的。
一、Serializable序列化
serializable使用比較簡單,只需要對某個類實現Serializable 介面即可。
Serializable 介面是一種標識介面,某個類實現Serializable 介面,Java便會對這個物件進行序列化操作。
我們編寫Person類:
public class Person implements Serializable { private staticfinal long serialVersionUID = -3139325922167935911L; // private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; }public void setName(String name) { this.name = name; } }
很簡單吧,無需過多解釋。接下來我們就將這個類從一個Acticity傳遞到另一個Activity。
MainActivity:
public class MainActivity extends Activity { // @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);// Person p = new Person(); p.setAge(18); p.setName("wanglei"); // Intent i = new Intent(this, SecondActivity.class); i.putExtra("person", p); startActivity(i); } }
SecondActivity:
public class SecondActivity extends Activity { // private static final String TAG = "WL"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = getIntent(); Person p=(Person) intent.getSerializableExtra("person"); Log.i(TAG, "age = "+p.getAge()); Log.i(TAG, "name = "+p.getName()); } }
以上程式碼及其簡單了就不解釋了,執行程式會看到如下列印:
以上就是Serializable方式序列化物件的舉例,真的很簡單,沒有什麼多餘要解釋的。
二、Parcelable序列化
arcel 在英文中有兩個意思,其一是名詞,為包裹,小包的意思; 其二為動詞,意為打包,扎包。郵寄快遞中的包裹也用的是這個詞。Android採用這個詞來表示封裝訊息資料。這個是通過IBinder通訊的訊息的載 體。需要明確的是Parcel用來存放資料的是記憶體(RAM),而不是永久性介質(Nand等)。
Parcelable,定義了將資料寫入Parcel,和從Parcel中讀出的介面。一個實體(用類來表示),如果需要封裝到訊息中去,就必須實現這一介面,實現了這一介面,該實體就成為“可打包的”了。
關與Parcelable方式實現序列化會比Serializable 方法麻煩一些,大體步驟如下:
1. 實現Parcelable介面
2. 覆寫describeContents方法,預設返回0。
3. 覆寫writeToParcel(Parcel dest, int flags)方法,指定寫入Parcel類的資料。
4. 建立Parcelable.Creator靜態物件,覆寫方法createFromParcel(Parcel in)與newArray(int size)。
介面的定義如下:
public interface Parcelable { //內容描述介面,基本不用管 public int describeContents(); //寫入介面函式,打包 public void writeToParcel(Parcel dest, int flags); //讀取介面,目的是要從Parcel中構造一個實現了Parcelable的類的例項處理。因為實現類在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板引數傳入。 //為了能夠實現模板引數的傳入,這裡定義Creator嵌入介面,內含兩個介面函式分別返回單個和多個繼承類例項。 public interface Creator<T> { public T createFromParcel(Parcel source); public T[] newArray(int size); } }
下面定義了一個簡單類People, 他需要把自身的資料,打入包中。 同時在訊息的接收方需要通過People實現的Parcelable介面,將People重新構造出來。
People.java public class People implements Parcelable { private String name = null; private int age = 0; private int sex = 0;// 0代表男、1代表女 public People() { super(); } public People(String name, int age, int sex) { super(); this.name = name; this.age = age; this.sex = sex; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); dest.writeInt(sex); } public static final Parcelable.Creator<People> CREATOR = new Creator<People>() { @Override public People[] newArray(int size) { return new People[size]; } @Override public People createFromParcel(Parcel source) { return new People(source.readString(), source.readInt(), source.readInt()); } }; }
傳遞People
//傳送 MainActivity.java People people = new People(); people.setName("張三"); people.setSex(Integer.parseInt(0)); people.setAge(Integer.parseInt(25)); Intent intent = new Intent(MainActivity.this, ShowActivity.class); Bundle b = new Bundle(); b.putParcelable("people", people); intent.putExtras(b); MainActivity.this.startActivity(intent); //接受 ShowActivity.java if(getIntent().getExtras().containsKey("people")){ People people = getIntent().getExtras().getParcelable("people"); }
參考:
https://www.cnblogs.com/xingfuzzhd/p/3454227.html
https://www.cnblogs.com/leipDao/p/8022063.html