Android 浅谈序列化Parcelable的使用

   今天在项目中要跨进程传递数据,发现以前编写项目的开发人员用的是Serializable。本来我也打算用的。但是一想到这不用存在本地磁盘中,就想到了性能问题,想到了一个好久没用的东西,没错就是Parcelable,废话不多说直接进入主题。
   我们知道实现Parcelable是为了进行序列化,那么为什么要序列化,什么是序列化呢?
   1.首先,我们先简单的理解下,什么是序列化。简单来说就是为了保存在内存中的各种对象状态,也就是实例变量,并且可以把保存的对象状态重新读取出来。
   2.为什么要序列化呢!序列化:
      一:永久性保存对象,保存对象的字节顺序到本地。
      二:通过序列化对象在网络中传递数据。
      三:通过序列化在进程之间进行传递数据。

     那么我们在Android中实现序列化的方法有两种:一是实现Serializable接口,一是实现Parcelable接口。在Android中Parcelable的效率比Serializable接口高效,可用于Intent数据传递,也可用于进程之间的通信。但是实现Parcelable的接口被Serializable的方法要复杂一些。但是并不是所有的都使用Parcelable接口,那么我们怎样抉择是否使用Parcelable接口呢!

     1.在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

     2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

     3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况,尽管Serializable效率低点,但此时还是建议使用Serializable.

     4.在android进程和服务中,简单的数据就不必序列化了,直接通过Intent传递就好。

    那Parcelable的实现步骤是怎样得呢?
   
    1.首先实现Parcelable接口 implements Parcelable
    2.重写writeToParcel方法,将你的对象序列化为一个Parcel对象,也就是:将类的数据写入外部提供的Parcel中,打包需要传递的数据到Parcel容器保存,以便于从Parcel容器获取数据。
    3.重写describeContents方法,内容接口描述,一般默认返回0就行。
    4.实例化静态内部对象CREATOR实现接口Parcelable.Creator (注意:这里一定要设置成静态的,如果不是静态的在运行的时候回出现Parcelable解析错误,内部对象CREATOR的名称不可以改变,必须全部大写)。

    这种注意的就是:其中public static final一个都不能少,内部的CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcel in)实现从Parcel容器中读取传递的数据值,封装成Parcelable对象返回逻辑层,newArray(int size)创建一个类型为T,长度为size的数组,return new T[size],供外部类发序列化本数组使用。

简单实现代码如下:
    
import android.os.Parcel;
import android.os.Parcelable;

public class TestParceable implements Parcelable {

	private int age;

	private String sex;

	private String name;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	private TestParceable(Parcel source) {
		age = source.readInt();
		sex = source.readString();
		name = source.readString();
	}

	@Override
	public int describeContents() {
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeInt(age);
		dest.writeString(sex);
		dest.writeString(name);
	}

	public Creator<TestParceable> getCREATOR() {
		return CREATOR;
	}

	public static final Parcelable.Creator<TestParceable> CREATOR = new Parcelable.Creator<TestParceable>() {

		@Override
		public TestParceable[] newArray(int size) {
			return new TestParceable[size];
		}

		@Override
		public TestParceable createFromParcel(Parcel source) {
			return new TestParceable(source);
		}

	};

}

    
  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值