Serializable和Parcelable的簡單介紹
Serializable和Pacelable接口可以完成對象的序列化過程,當我們需要通過Intent和Binder傳輸數據時就需要使用Parcelable或者Serializable。
Serializable接口 Serializable是Java所提供的一個序列化的接口,它是一個空接口,為對象提供標準的序列化和反序列化操作。
publicclass Person implements Serializable { private static final long serialVersionUID = 11347198374914134L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public intgetAge() { return age; } public void setAge(int age) { this.age = age; } }
想要讓一個類實現序列化,只需要這個類實現Serializable接口並聲明一個serialVersionUID即可。實際上,這個serialVersionUID也不是必須的,但是不聲明會產生影響。serialVersionUID是用來輔助序列化的,原則上序列化後數據中的serialVersionUID只有和當前類的serialVersionUID相同才能夠正常的被反序列化。serialVersionUID的詳細工作機制是這樣的:序列化的時候系統會把當前類的serialVersionUID寫入序列化的文件中,當反序列化的時候系統會去檢測文件中的serialVersionUID,看它是否和當前類的serialVersionUID一致,一致說明序列化的類和當前類的版本相同,可以成功反序列化,否則說明當前類發生了改變,這個時候就無法正常序列化。當我們沒有手動指定serialVersionUID的值時系統會自動生成,當類結構發生改變,系統會重新計算當前類的serialVersionUID值。這時就可能出現反序列化失敗的情況,所以我們應盡量手動指定serialVersionUID值。
Parcelable接口
Pracelable是android中的序列化方式,因此更適合用在android平臺上。缺點是使用起來較為麻煩,不僅需要聲明,還需要實現其內部方法。但是它的效率很高。
1 public class Book implements Parcelable { 2 3 private String name; 4 private String color; 5 6 public Book(String name, String color){ 7 this.name = name; 8 this.color = color; 9 } 10 11 public String getColor() { 12 return color; 13 } 14 15 public void setColor(String color) { 16 this.color = color; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 protected Book(Parcel in) { 28 color = in.readString(); 29 name = in.readString(); 30 } 31 32 @Override 33 public void writeToParcel(Parcel dest, int flags) { 34 dest.writeString(color); 35 dest.writeString(name); 36 } 37 38 public static final Creator<Book> CREATOR = new Creator<Book>() { 39 @Override 40 public Book createFromParcel(Parcel in) { 41 return new Book(in); 42 } 43 44 @Override 45 public Book[] newArray(int size) { 46 return new Book[size]; 47 } 48 }; 49 50 @Override 51 public int describeContents() { 52 return 0; 53 } 54 }
使用serializable和parcelable傳遞數據
//使用serializable傳遞數據 findViewById(R.id.btn_serializable).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); //傳遞方式一 intent.putExtra("put_person", person); //傳遞方式二 Bundle bundle = new Bundle(); bundle.putSerializable("bundle_person", person); intent.putExtras(bundle); startActivity(intent); } }); //使用parcelable傳遞數據 findViewById(R.id.btn_parcelable).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ThirdActivity.class); Book book = new Book("abc","yellow"); // intent.putExtra("book", book); Bundle bundle = new Bundle(); bundle.putParcelable("book",book); intent.putExtras(bundle); startActivity(intent); } });
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); TextView tv_content = (TextView) findViewById(R.id.tv_content); Intent intent = getIntent(); //Person person = (Person) intent.getSerializableExtra("put_person"); Person person = (Person) intent.getSerializableExtra("bundle_person"); tv_content.setText("name:" + person.getName() + " age:" + person.getAge()); } }
public class ThirdActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); TextView tv_content = (TextView) findViewById(R.id.tv_content); Intent intent = getIntent(); Book book = intent.getParcelableExtra("book"); tv_content.setText("name:" + book.getName() + " coloe:" + book.getColor()); } }
Serializable和Parcelable的簡單介紹