Serializable和Pacelable接口可以完成对象的序列化过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable。
Serializable接口 Serializable是Java所提供的一个序列化的接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。
public class 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 int getAge() { 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 @Override33 public void writeToParcel(Parcel dest, int flags) {34 dest.writeString(color);35 dest.writeString(name);36 }37 38 public static final CreatorCREATOR = new Creator () {39 @Override40 public Book createFromParcel(Parcel in) {41 return new Book(in);42 }43 44 @Override45 public Book[] newArray(int size) {46 return new Book[size];47 }48 };49 50 @Override51 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()); }}