Serializable 和 Parcelable
序列化:将对象转换为可以传输的二进制流的过程。
Serializable是 Java 提供的一个标准化的序列化接口。
想让一个对象实现序列化,只需要这个类实现Serializable接口并声明一个serialVersionUID即可。(不手动指定自动生成,反序列化时,当前类有所改变,系统会重新计算当前类的hash值并赋值给serialVersionUID,这时当前类的serialVersionUID和序列化的数据中的serialVersionUID不一致,反序列化失败)。序列化和反序列化过程需要大量I/O操作,开销很大。
Parcelable是 Android 提供的序列化接口。
Parcelable效率很高,主要用在内存序列化上。将对象序列化到存储设备中或者将对象序列化后通过网络传输,使用Serializable。
Parcelable方式
采用Parcelable需要实现接口,以及重写desrcibeContents() 和writeToParcel(...)方法,添加一个名为CREATOR的常量(即描述、序列化、反序列化)。
public class Person implements Parcelable { 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; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { @Override public Person createFromParcel(Parcel source) { Person person = new Person(); person.name = source.readString(); person.age = source.readInt(); return person; } @Override public Person[] newArray(int size) { return new Person[size]; } }; }
传递Person对象的方式 二者相同
Person person =new Person(); person.setName("Tom"); person.setAge(20); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("person_data", person); startActivity(intent);
Serializable获取对象方式
Person person = (Person) getIntent().getSerializableExtra("person_data");
Parcelable获取对象方式
Person person = (Person) getIntent().getParcelableExtra("person_data");