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接口
MainActivity
利用Parcelable序列化例子
写一个实体类,实现Parcelable接口,
1、复写describeContents方法和writeToParcel方法
2、实例化静态内部对象CREATOR,实现接口Parcelable.Creator 。
MainActivity和SecondActivity与上面的一样,唯一不同的就是SecondActivity 中
Serializable 和Parcelable的对比
android上应该尽量采用Parcelable,效率至上
编码上:
Serializable代码量少,写起来方便
Parcelable代码多一些
效率上:
Parcelable的速度比高十倍以上
serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。
这种方法的缺点是使用了反射,序列化的过程较慢。这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。
参考
http://www.jianshu.com/p/a60b609ec7e7
首先,我们要知道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
相关文章推荐
- Android序列化Serializable和Parcelable的理解和区别
- Android数据序列化之对Parcelable和Serializable的理解
- Android 序列化Serializable和Parcelable的理解和区别
- Android中Intent传递序列化对象的两种方法(Serializable,Parcelable)
- Java 序列化对象Serializable 与 Android 序列化对象Parcelable
- android序列化Serializable、Parcelable(一)
- Android序列化之Serializable和Parcelable
- Android使用序列化接口Parcelable、Serializable
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- Android使用序列化接口Parcelable、Serializable
- Android 实现序列化:Parcelable和Serializable接口的用法
- Android中使用Serializable和Parcelable实现序列化详解(含实例)
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-序列化,Parcelable,Serializable
- Android序列化——Serializable与Parcelable