Android Parcelable和Serializable的区别

1.作用

Serializable的作用是为了保存对象的属性到本地文件、网络流、数据库以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

从上面的设计上我们就可以看出优劣了。


2.效率

两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO流读写存储在硬盘上,

Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable。而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。


3.编程实现

   3.1  Serializable 接口

通过Serializable方式来实现对象的序列化,实现起来非常简单,我们只要实现Serializable接口即可,并提供一个序列化版本id(serialVersionUID:序列化前后的id要一致)即可,因为几乎所有的工作都被系统自动完成了。

   3.2   Parcelable接口

Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量(用来反序列化),实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。下面一个Parcelable的实现例子:

public class User implements Parcelable {
	int userID;
	String userNAME;
	boolean isMale;

	public User(int userID, String userNAME, boolean isMale) {
		super();
		this.userID = userID;
		this.userNAME = userNAME;
		this.isMale = isMale;
	}

	public User(Parcel in) {
		userID = in.readInt();
		userNAME = in.readString();
		isMale = in.readInt() == 1;

	}

	public int describeContents() {
		return 0;
	}

	// 序列化功能
	public void writeToParcel(Parcel out, int flags) {
		out.writeInt(userID);
		out.writeString(userNAME);
		out.writeInt(isMale ? 1 : 0);
	}

	// 反序列化功能:内部标明了如何创建序列化对象和数组
	public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {

		public User createFromParcel(Parcel in) {
			return new User(in);
		}

		public User[] newArray(int size) {
			return new User[size];
		}
	};

}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值