Android序列化:Serializable Parcelable
原文出处:http://blog.csdn.net/jdsjlzx/article/details/51122109?locationNum=14&fps=1
对于Parcel的理解: 在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。显然,JAVA的Serialize利用外部存储设备被认为是低效的, 可能也无法完美匹配Binder机制。在这样的环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。
为了便于ipc之间传递的数据的操作,binder引入了parcel的概念。parcel可以想成快递公司的包装箱,需要传递的各种类型的数据都被打包进parcel类,binder负责传递parcel对象,接收端则从parcel解出数据。这样的机制即减少了各种数据类型对传递的复杂性,又可以通过增加打包/解包parcel的数据类型,轻易实现扩展。 parcel已经支持容纳基本数据类型和一些复合数据类型。
下面内容转自 dairyman的专栏:http://blog.csdn.net/dairyman000/article/details/7247619
Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。
Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。
Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。
一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。
接口的定义如下:
Parcelable.java
public interface Parcelable {//内容描述接口,基本不用管 public int describeContents();//写入接口函数,打包 public void writeToParcel(Parcel dest, int flags);//读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。 //因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。 //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。 public interface Creator<T> {public T createFromParcel(Parcel source);public T[] newArray(int size);}
}
在实现Parcelable的实现中,规定了必须定义一个静态成员, 初始化为嵌入接口的实现类。
public static Parcel.Creator<DrievedClassName> CREATOR= new Parcel.Creator<DrievedClassName>();
下面内容转自 Java-Jinguo:http://jinguo.iteye.com/blog/657240
需求:我们经常需要在多个部件(activity或service)之间通过Intent传递一些数据,简单类型(如数字、字符串)的可以直接放入Intent。复杂类型(例如,J2ee中的Bean)的必须实现Parcelable接口。示例如下:
SampleBean.java
class SampleBean implements Parcelable
{private Bundle mBundle=new Bundle();public String getArriveTime(){return mBundle.getString("arriveTime");}public String getOlTime(){return mBundle.getString("olTime");}public void setArriveTime(String arriveTime){this.mBundle.putString("arriveTime", arriveTime);}public void setOlTime(String olTime){this.mBundle.putString("olTime", olTime);}
public int describeContents(){return 0;}
public void writeToParcel(Parcel out, int arg1){out.writeBundle(this.mBundle);}public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {public TrainInfo createFromParcel(Parcel in){SampleBean ti=new SampleBean();ti.mBundle=in.readBundle(); // 从Parcel中读出Bundlereturn ti;}public SampleBean[] newArray(int size){return new SampleBean[size];}};
}
这里采用Bundle是因为在Parcel中并没有key的概念存在,而Bundle相当于Map。
下面内容转自 lincode :http://www.blogjava.net/lincode/archive/2011/09/16/358805.html
Serializable 和 Parcelable 区别
android 中自定义的对象序列化的问题有两个选择一个是Parcelable,
另外一个是Serializable
序列化原因
- 永久性保存对象,保存对象的字节序列到本地文件中;
- 通过序列化对象在网络中传递对象;
- 通过序列化在进程间传递对象。
至于选取哪种可参考下面的原则
- 在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
- Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
- Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable- 不能很好的保证数据的持续性在外界有变化的情况下。
- 尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
Serializable是Java中的序列化接口,其使用起来简单但是开销很大,序列化和反序列化过程需要大量I/O操作。而Parcelable是Android中的序列化方式,因此,更适合用在Android平台上,它的缺点就是用起来稍微麻烦点,但是它的效率很高,这是Android推荐的序列化方式,因此,我们要首选Parcelable。Parcelable主要用在内存序列化上,通过Parcelable将对象序列化到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是这个过程会稍显复杂,因此在这两种情况下建议大家使用Parcelable。
Android序列化与反序列化
http://blog.csdn.net/axi295309066/article/details/52938422
Android序列化:Serializable Parcelable相关推荐
- Android | 序列化Serializable/Parcelable 使用总结
本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流. 文章目录 一.什么是序列化?为什么要序列化?怎么进行序列化? 二.Serializable 2.1 序列化举例 2.2 重写 ...
- android 序列化传参数,Android序列化之Parcelable和Serializable的使用详解
序列化与反序列 首先来了解一下序列化与反序列化. 序列化 由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化. 反序 ...
- Android 序列化(Serializable和Parcelable),kotlin开发windows程序
Parcelabel的实现,不仅需要实现Parcelabel接口,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口,并实现读写的抽象方法.如 ...
- Android 序列化(Serializable和Parcelable),android开发板底层开发
实现Parcelable接口
- Android 序列化(Serializable和Parcelable)
- android 保存 parcelable对象,Android 使用序列化Serializable和Parcelable
Android 序列化Serializable和Parcelable使用和区别 一:Serializable 1.什么是序列化 将一个类对象转换成可存储,可传输状态的过程. 2.什么是Serializ ...
- Android的序列化(Serializable和Parcelable)
[齐天的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qijinglai/article/details/80813423 前言 Android中要实现对象持久化或 ...
- android 序列化 xml serializable,关于Android中的序列化Serializable和Parcelable的学习
简单地说,"序列化"就是将运行时的对象状态转换成二进制,然后保存到流,内存或者通过网络传输给其他端. 两者最大的区别在于 存储媒介的不同,Serializable使用 I/O 读写 ...
- Android 进阶——持久化存储序列化方案Serializable和IPC及内存序列化方案Parcelable详解与应用
文章大纲 引言 一.文件的本质 二.序列化和反序列化概述 1.序列化和反序列化的定义 2.序列化和反序列化的意义 三.Serializable 1.Serializable 概述 2.JDK中序列化和 ...
最新文章
- ssh_config sshd_config 详解
- spring + maven项目 互相依赖的小坑
- A - System Administrator CodeForces - 245A(水题)
- vs联合torch,ZED相机api,opencv建立C++项目
- Taro+react开发(93):判断是否是H5端
- easyui下拉框option写死_JavaScript_jQuery+easyui中的combobox实现下拉框特效,1.第一种写法:Input框中显示: - phpStudy...
- 字符串、字符数组、字符串数组
- Sublime Text报错please wait a bit whilePyV8 binary is being downloaded
- java String 判断是否包含某字符串
- 例解List<Map<String, Object>>存放的对象问题
- 利用CSS3制作网页动画
- 【IoT】产品模型:基于 ARM 的音视频采集与传输系统
- Flex Builder教程
- (概论)java web后台开发跟手机APP后台开发有什么不同
- 在mac上怎么把png转换成jpg
- Android 第三方登录之支付宝登录
- 隐形窗口_建立网站时要考虑的隐形(但至关重要)注意事项
- 按照C++语言程序结构组成数字电路进行计算的计算机
- sketch-code让草图秒变HTML
- python元类_Python基础:元类