gavanwanggw

导航

Android开发之Serializable 和 Parcelable的差别(源码分享)

  android 中自己定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

一 序列化原因:

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


二 至于选取哪种可參考以下的原则:

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


2.Serializable在序列化的时候会产生大量的暂时变量。从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况。由于Parcelable不能非常好的保证数据的持续性在外界有变化的情况下。虽然Serializable效率低点, 也不提倡用,但在这样的情况下,还是建议各位能够用Serializable 。

Serializable 的实现,仅仅须要继承  implements Serializable 就可以。

这仅仅是给对象打了一个标记,系统会自己主动将其序列化。

Parcelable的实现须要下面步骤

(1)describeContents方法。内容接口描写叙述,默认返回0就能够;

(2)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包须要传递的数据到Parcel容器保存。以便从parcel容器获取数据。该方法声明例如以下:

writeToParcel (Parcel dest, int flags)

(3)创建对应函数的构造方法

(4)静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层

newArray(int size) return new T[size])

源码例如以下

package com.example.service;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable{
    private int age;
    private String name;
    
	public Person(Parcel in) {
		age=in.readInt();
		name=in.readString();
	}

	public int getAge() {
		return age;
	}

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

	public String getName() {
		return name;
	}

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

	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags) {
		// TODO Auto-generated method stub
		dest.writeInt(age);
		dest.writeString(name);
	}
	public static final Parcelable.Creator<Person> CREATOR=new Creator<Person>() {
		
		@Override
		public Person[] newArray(int size) {
			// TODO Auto-generated method stub
			return new Person[size];
		}
		
		@Override
		public Person createFromParcel(Parcel source) {
			// TODO Auto-generated method stub
			return new Person(source) ;
		}
	};

}


posted on 2017-04-26 14:11  gavanwanggw  阅读(134)  评论(0编辑  收藏  举报