本文主要介绍Parcelable
和Serializable
的作用、效率、区别及选择。
1、作用
Serializable
的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方
便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable
的设计初衷是因为Serializable
效率过慢,为了在程序内不同组件间以及
不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable
是通过IBinder
通信的消息的载体。
从上面的设计上我们就可以看出优劣了
2、效率及选择
Parcelable
的性能比Serializable
好,在内存开销方面较小,所以在内存间数据传输
时推荐使用Parcelable
,如activity
间传输数据,而Serializable
可将数据持久化方便
保存,所以在需要保存或网络传输数据时选择Serializable
,因为android不同版本Parcelable
可能不同,所以不推荐使用Parcelable
进行数据持久化。
3、编程实现
对于Serializable
,类只需要实现Serializable
接口,并提供一个序列化版本id(serialVersionUID)
即可。而Parcelable
则需要实现writeToParcel
、describeContents
函数以及静态的CREATOR变量,实际上就是将如何打包和解包
的工作自己来定义,而序列化的这些操作完全由底层实现。
Parcelable
的一个实现例子如下
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// 写数据进行保存
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// 用来创建自定义的Parcelable的对象
public static final Parcelable.Creator<MyParcelable> CREATOR= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
// 读数据进行恢复
private MyParcelable(Parcel in) {
mData = in.readInt();
mStr = in.readString();
}
}
从上面我们可以看出Parcel的写入和读出顺序是一致的。如果元素是list读出时需要
先new一个ArrayList
传入,否则会报空指针异常。如下:
list = new ArrayList<String>();
in.readStringList(list);
PS: 在自己使用时,read数据时误将前面int数据当作long读出,结果后面的顺序错乱,报如下异常,当类字段较多时务必保持写入和读取的类型及顺序一致。
12-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lan
g.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshal
ling unknown type code 3014773 at offset 164
4、高级功能上
Serializable
序列化不保存静态变量,可以使用Transient
关键字对部分字段不进行序
列化,也可以覆盖writeObject
、readObject
方法以实现序列化过程自定义。
更多内容详情请关注我的GitHub:https://github.com/xiangjiana/Android-MS
相关推荐
Android提供了两种主要的序列化方式:Parcelable和Serializable。这两种方式都可以将对象转换为字节流,便于存储、传输或恢复。下面将详细讨论Android通过Parcelable和Serializable实现各种类型嵌套序列化的方法。 ...
android Activity之间数据传递 Parcelable和Serializable接口的使用的具体实例代码,详情请看>http://blog.csdn.net/js931178805/article/details/8268144
在Android开发中,数据传输和序列化是必不可少的环节,其中`Parcelable`和`Serializable`是两种常用的序列化方式。本文将深入解析这两种机制的区别、优缺点以及它们的使用场景。 首先,`Serializable`接口是Java...
本文将深入探讨两种主要的序列化方式:Serializable和Parcelable,并比较它们的优缺点以及适用场景。 首先,我们来了解什么是序列化。序列化是将对象的状态转换为可存储或可传输的形式的过程。在Android中,这个...
Android序列化技术详解 - Parcelable和Serializable的使用详解 序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在 Android 开发中,序列化是一种常用的数据存储和传输方式。今天,我们将...
在Android开发中,数据传输和保存是常见的需求,而`Parcelable`和`Serializable`就是两种主要的序列化机制。它们都是将对象转换为字节流,以便存储或在网络中传递,但`Parcelable`通常被认为比`Serializable`更高效...
`Parcelable`是Android提供的一种高效的数据序列化方式,相比`Serializable`,它的序列化和反序列化速度更快,但实现过程相对复杂。 标题"Android Parcelable序列化自定义类集合在Activity间传递"所涉及的知识点...
在Android中,Parcelable是数据序列化的高级接口,它比Serializable效率更高。如果要在AIDL中传递自定义对象,这些对象必须实现Parcelable接口。实现Parcelable接口通常包括以下步骤: 1. 创建一个内部静态类`...
数据通过Intent.putExtra()方法添加,支持基本数据类型(如字符串、整型、浮点型)以及Parcelable和Serializable对象。当Intent传递的数据量较小或不涉及复杂对象时,Intent是非常方便的选择。 2. **Bundle**: ...
在Android开发中,Parcelable接口是用于对象序列化的一种高效机制,相比Java的Serializable接口,它在数据传输和存储时性能更高。"parcelable android demo"是一个实战项目,旨在帮助开发者理解并掌握Parcelable的...
Android开发中的Parcelable接口是用于对象序列化的一种高效方式,它比Java自带的Serializable接口性能更好,但编写起来较为繁琐。`android-parcelable-intellij-plugin`是一个IntelliJ IDEA的插件,它可以帮助开发者...
在Android中用Parcelable序列化虽然效率高,但是比Serializable麻烦很多;现在只要添加一个Jar包就可以省去序列化的过程,很方便。 Jar包在项目里,可以直接使用,也可以查看里面的文本文件"README.md
Android中的传递有两个方法,一个是Serializable,另一个是Parcelable。 Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable...
Parcelable是Android为我们提供的序列化的接口。 对比: 1、Parcelable相对于Serializable的使用相对复杂一些。 2、Parcelable的效率相对Serializable也高很多。 3、Parcelable不能使用在要将数据存储在磁盘上的情况...
Parcelable是Android平台提供的一种高效的数据序列化方式,比传统的Serializable接口性能更好,但使用起来也相对复杂。本文将深入探讨Android中的Parcelable接口及其序列化流程。 首先,`Parcelable`接口是Android...
Android提供了两种主要的序列化方式:`Serializable`和`Parcelable`。本文将深入探讨`Parcelable`,它是Android平台中效率更高的序列化接口。 **一、Parcelable简介** `Parcelable`是Android系统提供的一个接口,...
被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...
在Android中,Parcelable接口是实现序列化的两种方法之一,另一种是Serializable接口。 Parcelable接口的实现是为了进行序列化,序列化的目的是为了永久性保存对象、通过序列化对象在网络中传递对象、通过序列化在...