前言
Android中Intent中传递对象有两种方法,一种是该对象实体实现Serializable接口,使用putSerializable(Key,Object);另一种是实现Parcelable接口,使用putParcelable(Key, Object)方法。
一、为什么要序列化,以及两种序列化方式的区别?
Serializable接口和Parcelable接口都可以实现序列化,那么为什么要实现序列化那,这是因为:
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。
Serializable接口和Parcelable接口实现序列化序列化的区别:
Serializable接口是Java支持的方法,实现方式比较简单只需要声明一下就可以。
Parcelable接口是android特有的,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)但是实现稍微复杂一些,但效率更高,推荐用这种方法提高性能。
二、使用方法
1.Serializable 接口使用方式
实体先实现接口,直接声明即可
代码如下(示例):
public class User implements Serializable {
private String userId;
private String userName;
}
这样便实现了接口,然后使用Intent调用方法传递即可
代码如下(示例):
User user = new User();
Intent intent = new Intent(context,NewActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("user",user);
intent.putExtras(bundle);
startActivity(intent);
2.Parcelable接口使用方式
Parcelable接口实现有些复杂
1)implements Parcelable
2)重写describeContents这个方法用于内容描述,基本不用管,默认返回0就可以
3)重写writeToParcel方法,这个方法将你的对象序列化为一个Parcel对象,即:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便从 Parcel容器获取数据
4)实例化静态内部对象CREATOR实现接口Parcelable.Creator
5)实创建实体的带Parcel的构造方法
代码如下(示例):
public class User implements Parcelable{
private String userId;
private String userName;
public User () {
}
public User (Parcel in) {
userId = in.readString();
userName = in.readString();
}
@Override
public int describeContents() {
return 0;
}
//写入接口函数,打包
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(userId);
dest.writeString(userName);
}
public static final Parcelable.Creator<Use > CREATOR = new Creator<User>() {
@Override
public User[] newArray(int size) {
return new User[size];
}
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
};
}
这样便实现了接口,然后使用Intent调用方法传递即可,与Serializable对象不同的是Parcelable可以传递列表。
代码如下(示例):
User user = new User();
ArrayList<User> list = new ArrayList<>();
Intent intent = new Intent(context,NewActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user",user);
bundle.putParcelableArrayList("list",list);
intent.putExtras(bundle);
startActivity(intent);
总结
Serializable的实现,只需要implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
Parcelabel的实现,不仅需要implements Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口。
但是Parcelabel可以传递List,Serializable只可以传递对象