1.Parcelable和Serializable有什麼用,它們有什麼差別?
2.自定義一個類讓其實現Parcelable,大致流程是什麼?
Parcelable和Serializable有什麼用,有什麼差別?
Parcelable和Serializable都可以實現序列化,使對象可以變為二進制流在內存中傳輸數據。Serizable和Parcelable接口可以完成對象的序列化過程,什麼是序列化?序列化就是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程,在序列化期間,對象將其當前狀態寫入到臨時或持久存儲區,以後,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。而Serializable是java所提供的一個序列化接口,當然,Android中提供瞭新的序列化方式,那就是Parcelable接口,Parcelable接口隻能在Android使用,使用較為稍微復雜一些。那兩者有什麼本質上的區別呢?
一.實現方式上
Serializable的使用隻需實現Serializable接口就能使用,serialVersionUID也不是必須的(有它能減少反序列化失敗),Parcelable不僅需要實現Parcelabel,還需要在類中添加一個靜態成員變量CREATOP,這個變量需要實現Parcelable Creator接口。
二.效率上
serializable是java的序列化接口,使用起來簡單但是開銷大,序列化和反序列化需要大量I/O操作,而Pacelable是Android中的序列化方式,因此,更適合用在Android平臺上,它的缺點是使用起來稍微麻煩點,但是效率高。
三.應用場景上
在將對象序列化到存儲設備中或者將對象序列化後通過網絡傳輸到其他設備,用Parcelable來實現的話會很復雜,建議使用Serializable,其他地方建議使用Parcelable;
2.自定義一個類讓其實現Parcelable,大致流程是什麼?
1.首先implements Parcelable
2.重寫WriteToParcel,完成序列化功能,將當前對象寫入序列化結構中
3.重寫describeContents,完成內容描述功能,返回當前對象的內容描述,如果含有文件描述符,返回1,否則返回0,幾乎所有情況返回0
4.實例化靜態對象CREATOR,實現接口Parcelable,Creator<>,完成反序列化功能,其內部標明瞭如何創建序列化對象和數組,並通過Parcel的一系列read方法來完成反序列化過程。
具體例子:
首先創建一個實現Parcelable接口的自定義類:
public class User implements Parcelable { private String userName; private boolean isMale; protected User(Parcel in) { userName = in.readString(); isMale = in.readByte() != 0; } public User(String userName,boolean isMale){ this.userName = userName; this.isMale = isMale; } public String getUserName() { return userName; } public boolean isMale() { return isMale; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(userName); parcel.writeInt(isMale ? 1:0); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; }
在MainActivity:
public class MainActivity extends Activity implements View.OnClickListener { private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button)findViewById(R.id.btn_one); btn.setOnClickListener(this); } @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, OtherActivity.class); User myParcelable = new User("sdsds",false); Bundle bundle = new Bundle(); bundle.putParcelable("value", myParcelable); intent.putExtras(bundle); startActivity(intent); } }
OtherActivity:
public class OtherActivity extends Activity { private TextView text; @Override protected void onCreate(Bundle savedInstance){ super.onCreate(savedInstance); setContentView(R.layout.activity_other); text = (TextView)findViewById(R.id.text_one); Bundle bundle = getIntent().getExtras(); User user = bundle.getParcelable("value"); text.setText(user.getUserName() +""+user.isMale()+""); } }
運行結果如下: