Android学习笔记32——Parcelable接口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengxu_kuangrexintu/article/details/86766103

前言

前面介绍了通过Serializable方式来实现序列化的方法,这里介绍另外一种序列化方式Parcelable。它也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递。

Parcelable的例子

public class User implements Parcelable{

	public int userId;
	public String userName;
	public boolean isMale;
	
	public Book book;

	public User(int userId,String userName,boolean isMale){
			this.userId = userId;
			this.userName = userName;
			this.isMale = isMale;
	}
	
	public int describeContents(){
		return 0;
	}
	
	public void writeToParcel(Parcel out,int flags){
		out.writeInt(userId);
		out.writeString(userName);
		out.writeInt(isMale ? 1:0);
		out.writeParcelable(book,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];
		}
	};

	private User(Parcel in){
		userId = in.readInt();
		userName = in.readString();
		isMale = in.readInt() == 1;
		book = in.readParcelable(Thread.currentThead().getContextClassLoader());
	}
}

Parcel内部包装了可序列化的数据,可以在Binder中自由传输。从上述代码中可以看出来,在序列化过程中实现的功能有序列化、反序列化和内容描述。序列化功能由writeToParcel方法来完成,最终是通过Parcel中的一系列write方法来完成的;反序列化功能由CREATOR来完成,其内部标明了如何创建序列化对象和数组,并通过Parcel的一系列read方法来完成反序列化过程;内容描述功能由describeContents方法来完成,几乎在所有情况这个都应该返回0,仅当当前对象中存在文件描述符时,此方法返回1。需要注意的是,在User(Parcel in)方法中,由于book是另一个可序列化对象,所以它的反序列化过程需要传递当前线程的上下文类加载器,否则会报无法找到类的错误。
在这里插入图片描述
系统已经为我们提供了许多实现了Parcelable接口的类,它们都是可以直接序列化的,比如Intent、Bundle、Bitmap等,同时List和Map也可以序列化,前提是它们里面的每个元素都是可序列化的。

Parcelable的作用

1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。

Parcelable和Serializable的区别和比较

ParcelableSerializable都是实现序列化并且都可以用于Intent间传递数据,Serializable是Java的实现方式,可能会频繁的IO操作,所以消耗比较大,但是实现方式简单Parcelable是Android提供的方式,效率比较高,但是实现起来复杂一些 , 二者的选取规则是:内存序列化上选择Parcelable, 存储到设备或者网络传输上选择Serializable(当然Parcelable也可以但是稍显复杂)。

选择序列化方法的原则

  1. 在使用内存的时候,ParcelableSerializable性能高,所以推荐使用Parcelable
  2. Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
  3. Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable

猜你喜欢

转载自blog.csdn.net/chengxu_kuangrexintu/article/details/86766103