Android中Serializable和Parcelable接口的区别和用法



前言

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只可以传递对象

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值