系列(5)Serializable 和 Parcelable 的使用和區別
1、 序列化的目的
(1)永久的儲存物件,將物件資料儲存在檔案、磁碟或者資料庫中 。
(2)通過序列化操作將物件資料在網路上進行傳輸 。
(3)將物件序列化之後在程序間進行傳輸 。
(4)在安卓中使用 Intent 進行傳輸時候,資料型別較為複雜的需要進行序列化操作 。
2、 Serializable
public class Mybox4 implements Serializable { private String name; private String age; public Mybox4(String name, String age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "Mybox4{" + "name='" + name + '\'' + ", age='" + age + '\'' + '}'; } }
通過上述程式碼可以看出,使用 Serializable 的時候比較簡單,只需要實現 Serializable 介面即可,這樣就告訴程式這個類是可以被序列化的。
下面看下如何實現物件的序列化與反序列化:
Mybox4 mybox4 = new Mybox4("keven", "27"); File file = new File("box.out"); //序列化 FileOutputStream outputStream = new FileOutputStream(file); ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); objectOutputStream.writeObject(mybox4); objectOutputStream.close(); //反序列化 FileInputStream fileInputStream = new FileInputStream(file); ObjectInputStream inputStream = new ObjectInputStream(fileInputStream); Mybox4 o = (Mybox4) inputStream.readObject(); inputStream.close(); System.out.println(o.toString());
輸出為:
Mybox4{name='keven', age='27'}
3、 Parcelbale
Parcelable 是 Android 特有的序列化方式,他的實現相對 Serialiable 來說更加複雜一點。
Parcelable 內部包裝了可序列化的資料,序列化功能由 writeToParcel 方法完成,反序列化由 CREATOR 完成。
public class Mybox4Par implements Parcelable { private String name; private String age; public Mybox4Par(String name, String age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "Mybox4Par{" + "name='" + name + '\'' + ", age='" + age + '\'' + '}'; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(age); } public static final Parcelable.Creator<Mybox4Par> CREATOR=new Creator<Mybox4Par>() { @Override public Mybox4Par createFromParcel(Parcel source) { return new Mybox4Par(source); } @Override public Mybox4Par[] newArray(int size) { return new Mybox4Par[size]; } }; public Mybox4Par(Parcel in){ name=in.readString(); age=in.readString(); } }
上述就是實現了 Parcelable 介面,並重寫方法,我們看下如何使用:
//第一個Activity Mybox4Par mybox4Par=new Mybox4Par("keven","25"); Bundle bundle=new Bundle(); Intent intent=new Intent(this,MyViewActivity.class); bundle.putParcelable("box",mybox4Par); intent.putExtras(bundle); startActivity(intent);
//第二個Activity Intent intent=getIntent(); Bundle extras = intent.getExtras(); Mybox4Par box = extras.getParcelable("box"); Log.e("box",box.toString());
4、 兩者選擇
Serializable 使用簡單但是開銷很大,序列化與反序列化需要大量的 I/O 操作,一般用於將物件序列化到儲存裝置中,或序列化後通過網路傳輸;
Parcelable 使用稍微麻煩點,但是效率高,主要用在記憶體序列化上。