您的位置:首页 > 职场人生

Android面试笔记——序列化Serializable和Parcelable的理解

2017-01-17 11:17 651 查看
最近在面试的时候经常会遇到这样一个面试题,谈谈你对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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息