序列化:为了保存在内存中的各种对象的状态,并可以把保存的对象的状态读出来

安卓中实现序列化的接口有两个,一个是serializable,一个是parcelable。

一、实现序列化:

  1、是可以将对象永久性保存在磁盘中

  2、是可以把对象在网络中传递

  3、是让对象在进程中传递。
二、serializable和parcelable的比较
  1、parcelable比serializable稍复杂
  2、parcelable效率更高,性能更优
三、适用场景
  1、复杂类型
  2、不适合处理简单数据,如字符串
  3、不适合序列化对象在磁盘上的情况

一、Seralizable介绍:

1.Serializable 是java的序列化技术,最简单的使用方式为在需要序列化的class增加implements Serializable,并增加一个唯一个序列化id:

private static final long serialVersionUID = 1L;

默认方式最好直接设置为1L,因为java  sdk会自动进行hash计算,并生成唯一的UID值。手动设置serialVersionUID的好处是当前class如果改变了成员变量,比如增加或者删除之后,这个UID是不改变的,那么反序列化就不会失败;自动设置则在改变了成员变量之后就会重新计算获得新的UID,从而导致失败。不过,大多数情况下两者都可以。

2.Seralizable相对Parcelable而言,好处就是非常简单,只需对需要序列化的类class执行就可以,不需要手动去处理序列化和反序列化的过程,所以常常用于网络请求数据处理,Activity之间传递值的使用。

Activiyt之间传递如图:

3.Seralizable无法序列化静态变量,使用transient修饰的对象也无法序列化。

4.当一个父类实现序列化,子类自动实现序列化,不需要再显示实现Serializable接口。

二、Parcelable介绍:

1.Parcelable是android特有的序列化API,它的出现是为了解决Serializable在序列化的过程中消耗资源严重的问题,但是因为本身使用需要手动处理序列化和反序列化过程,会与具体的代码绑定,使用较为繁琐,一般只获取内存数据的时候使用。

2.而Parcelable依赖于Parcel,Parcel的意思是包装,实现原理是在内存中建立一块共享数据块,序列化和反序列化均是操作这一块的数据,如此来实现。

3.Parcelable的三个过程:序列化、反序列化和描述

public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
//描述:返回值为0或者CONTENTS_FILE_DESCRIPTOR(即1),如果writeToParcel(Parcel dest, int flags)的输出包含文件描述符,则返回1,否则返回0,
//几乎所有的情况之下都是返回0.
public int describeContents() {
return 0;
} // 写数据进行保存,序列化,out表示需要写入序列化的对象。flags有两种值0和PARCELABLE_WRITE_RETURN_VALUE(即1),几乎所有的情况下都是0.
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
} // 用来创建自定义的Parcelable的对象,反序列化,必须包含一个非空的静态实现了Parcelable.Creator接口的CREATOR
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);

当类字段较多时务必保持写入和读取的类型及顺序一致。

描述describecontents:
一般情况下设置为0,特别的为

这种是当要求为file descriptor(文件描述符)被序列化的情况。

附:

Parcel是一个用于包装各种数据的容器类。经过Parcel后的数据可以在blinder进程间通信,IPC的服务端与客户端数据交互。

Parcelable:是一个使对象能够Parcel的接口。Parcelable要想可以打包自定义数据结构,必须实现Parcelable方法。

————————————————
版权声明:本文为CSDN博主「hacker_crazy」的原创文章,遵循undefined版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hacker_crazy/article/details/80840868

最新文章

  1. python install (version problem-method ln -s)
  2. [转载]TexturePacker 如何使用自带的加密功能及在cocos2dx中的使用
  3. 将Unity3D游戏移植到Android平台上
  4. 24点C++程序实现 编程之美1.16
  5. 【转】用户空间使用i2c_dev--不错
  6. Kinect 常用识别手势
  7. keydown - &gt; keypress - &gt; keyup
  8. [Spark内核] 第37课:Task执行内幕与结果处理解密
  9. yii2自带的backend,frontend不够用,添加一个后台模块怎么做?
  10. Java8——快速入门手册(学习笔记)
  11. SQL Server分页查询的万能存储过程
  12. 【Redis】2、CentOS 7 上安装 redis3.2.3安装与配置
  13. Python学习之函数进阶
  14. javascript仿新浪微博图片放大缩小及旋转效果
  15. [原][osg][gdal]两种方式修改tiff高程
  16. docker 搭建Mysql集群
  17. 【Redis】Linux下Redis安装与redis-desktop-manager使用(无法连接Redis服务器解决方法)
  18. 两个不错点电影ED2000资源
  19. 设置vim颜色方案
  20. OpenGL绘制一个三角形

热门文章

  1. 数据库SQL调优的几种方式(转)
  2. .net Core 在 CentOS7下,报The type initializer for &#39;Gdip&#39; threw an exception.异常
  3. computed和watch运用场景
  4. VS2008的使用
  5. UML指南系列——用例图
  6. HBase 热点问题——rowkey散列和预分区设计
  7. python 三方库字典
  8. 13-vim-复制和粘贴-01-复制和粘贴
  9. ionic node-sass安装或编译失败:MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
  10. 【教程】CentOS 7安装 最新版本Docker