文档章节

Android Intent (2) Serializable vs Parcelable

风荷举
 风荷举
发布于 2013/11/09 17:22
字数 578
阅读 402
收藏 11

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

Android 主要是通过Intent来实现组件之间的相互调用,同时还可以传递附加的数据。这些数据主要是存储在Bundle之中(当调用Intent.putExtras(Bundle)时,Android会复制Bundle中的数据,而不是引用,因此再修改Bundle中的数据并不会改变Intent中携带的数据)。

Bundle之中可以存放基本数据类型以及实现了Serializable或Parcelable接口的类。

当我们要向Bundle中存放一个类Obj(包含两个int成员的简单类),可以让它实现Serializable或Parcelable接口,如下所示:

1.Serializable

public class Obj implements Serializable {
	private int a;
	private int b;
	public Obj(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	@Override
	public String toString() {
		return "Obj: [" + a + ", " + b + "]";
	}
}
我们可以通过intent.putExtra("obj", new Obj(1, 2));来将其放入intent中,然后通过 obj = (Obj) intent.getSerializableExtra("obj");来将其取出。

2.Parcelable

public class ObjPar implements Parcelable {
	private int a;
	private int b;
	public ObjPar(int a, int b) {
		this.a = a;
		this.b = b;
	}
	
	@Override
	public String toString() {
		return "Obj: [" + a + ", " + b + "]";
	}
	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeInt(a);
		dest.writeInt(b);
	}
	
	public static final Parcelable.Creator<ObjPar> CREATOR = new Creator<ObjPar>() {
		
		@Override
		public ObjPar[] newArray(int size) {
			return new ObjPar[size];
		}
		
		@Override
		public ObjPar createFromParcel(Parcel source) {
			
			return new ObjPar(source.readInt(), source.readInt());
		}
	};
}
我们可以通过intent.putExtra("objpar", new ObjPar(1, 2));来将其放入intent中,然后通过 objpar =  (ObjPar) intent.getParcelableExtra("objpar"); 来将其取出。

以上是两种向Bundle中存放Object对象的方法,明显可以看出实现Serializable接口更加简单,因为他是一个标记性的接口,并不需要实现某个具体方法。相比而言实现Parcelable接口就显得相对复杂一些,但这样带来的好处是性能的大幅提高。这是因为当我们实现Serializable接口后,真正的序列化工作是由JDK来完成,他需要通过反射来获取成员变量,因为反射的性能并不高,因此这种序列化方式速度慢。然而实现Parcelable接口时,我们提供了该接口中定义方法的实现(writeToParcel实现序列化,createFromParcel实现反序列化),这就避免了反射的使用,因此这种方式速度快。

那么这两种方式,性能差别有多大呢?下面是国外网站上的一个测试结果:Serializable耗时是Parcelable的10倍左右


© 著作权归作者所有

风荷举
粉丝 11
博文 24
码字总数 24803
作品 0
朝阳
程序员
私信 提问
加载中

评论(2)

java9
java9
mark
tsui_lance
tsui_lance
学习了,
Android中Parcelable接口用法

Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel。 Classes implementing the Parcelable interface must also have a static field ......

AlexMahoneFBI
2015/03/09
109
0
Android Parcelable 定义高效的序列化对象

1.实现Parcelable就是为了进行序列化,那么,为什么要序列化? 1)永久性保存对象,保存对象的字节序列到本地文件中; 2)通过序列化对象在网络中传递对象; 3)通过序列化在进程间传递对象。...

IamOkay
2014/12/03
424
0
Android传递List的用法

日常的开发过程中,我们经常需要通过Intent和Binder传输数据,Object 类型不能直接传递,需要通过序列化。序列化是将对象状态转换为可保持或传输的格式,包括Parcelable和Serializable两种方...

充电实践
2018/05/20
0
0
Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

在Android中的不同Activity之间传递对象,我们可以考虑采用 Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object要实现Seria...

鉴客
2011/11/14
4.2K
0
Android中Parcelable的使用

转载请标明出处 :https://www.cnblogs.com/tangZH/p/10998065.html Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口。 Parcelable是Android为我们提供的序...

妖久
06/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JVM性能调优的6大步骤,及关键调优参数详解

JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,...

一只会编程的狼
6分钟前
4
0
并发和并行性有什么区别?

并发和并行性有什么区别? 示例被赞赏。 #1楼 并发性:具有共享资源潜力的多个执行流 例如:两个线程争用一个I / O端口。 平行主义:将问题分成多个相似的块。 例如:通过在文件的每半部分上...

javail
9分钟前
4
0
(推荐使用)提高开发效率工具集合

提高开发效率工具集合(推荐使用) 一、Hutool工具类 官网地址:https://www.hutool.cn/ Github地址:https://github.com/looly/hutool/ Gitee 地址:https://gitee.com/loolly/hutool/ 文档参...

明德先生
12分钟前
4
0
java并发-缓存一致性协议和内存屏障的思考和理解

################这是之前的思考 内存屏障只是保证清空流水线,如何保证高速缓存的内容更新到最新或刷新到主存呢?这个问题突然想到了,不知道这个需要怎回答。 内存屏障保证的CPU执行执行序...

萧默
16分钟前
5
0
类型名称后面的括号是否与new有所不同?

如果“测试”是普通类,则之间是否有任何区别: Test* test = new Test; 和 Test* test = new Test(); #1楼 new Thing(); 很明显,您想要一个构造函数,而new Thing; 表示您不介意是否未调...

技术盛宴
40分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部