最近在面试的时候经常会遇到这样一个面试题,谈谈你对Serializable和Parcelable的理解。今天刚好有时间就总结一下,方便自己以后查看。
首先,我们要知道android为什么要序列化?
大家都知道,android通过Intent在Activity或Service之间传递数据,如果我们要传递自己定义的对象,Android规定必须实现Serializable接口或Parcelable接口。
Serializable(Java自带):
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
Parcelable(android 专用):
除了Serializable之外,使用Parcelable也可以实现相同的效果,
不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,
而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
利用Serializable序列化例子
写一个实体类,实现Serializable接口
public class Person implements Serializable{
private String name;
private int age;
private String address;
public Person(){
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
MainActivity
public class MainActivity extends Activity {
private TextView tv_time;
private Button click;
private Person person;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_time = (TextView) findViewById(R.id.time);
click = (Button) findViewById(R.id.btn);
person = new Person();
click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
person.setName("zhang");
person.setAge(20);
intent.putExtra("p",person);
startActivity(intent);
}
});
}
}
SecondActivity
public class SecondActivity extends Activity{
private TextView desc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
desc = (TextView) findViewById(R.id.text);
Person person = (Person) getIntent().getSerializableExtra("p");
desc.setText("name:::"+person.getName());
}
}
利用Parcelable序列化例子
写一个实体类,实现Parcelable接口,
1、复写describeContents方法和writeToParcel方法
2、实例化静态内部对象CREATOR,实现接口Parcelable.Creator 。
public class Person implements Parcelable{
private String name;
private int age;
private String address;
public Person(){
}
protected Person(Parcel in) {
name = in.readString();
age = in.readInt();
address = in.readString();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(address);
}
}
MainActivity和SecondActivity与上面的一样,唯一不同的就是SecondActivity 中
Person person = (Person) getIntent().getSerializableExtra("p");
改为
Person person = getIntent().getParcelableExtra("p");
Serializable 和Parcelable的对比
android上应该尽量采用Parcelable,效率至上
编码上:
Serializable代码量少,写起来方便
Parcelable代码多一些
效率上:
Parcelable的速度比高十倍以上
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。
这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
参考
http://www.jianshu.com/p/a60b609ec7e7