Serializable 和Parcelable 详解
序列化:为了保存在内存中的各种对象的状态,并可以把保存的对象的状态读出来
安卓中实现序列化的接口有两个,一个是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
Serializable 和Parcelable 详解的更多相关文章
- 【转】C#中Serializable序列化实例详解
		
这篇文章主要介绍了C#中Serializable序列化,以实例形式详细讲述了系列化的技术及各种序列化方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#中Serializable序列化.分 ...
 - Android中Serializable和Parcelable序列化对象详解
		
学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.P ...
 - Java 序列化Serializable详解
		
Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...
 - Java 序列化Serializable详解(附详细例子)
		
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
 - java 序列化Serializable 详解
		
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...
 - Java 序列化Serializable详解(附详细例子)
		
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...
 - Serializable详解(1):代码验证Java序列化与反序列化
		
说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...
 - 【Android】详解Android Service
		
目录结构: contents structure [+] Service简单概述 Service在清单文件中的声明 Service启动服务 Service绑定服务 扩展Binder类 使用Messen ...
 - Android——Android Bundle详解(转)
		
Android Bundle详解 1 Bundle介绍 Bundle主要用于传递数据:它保存的数据,是以key-value(键值对)的形式存在的. 我们经常使用Bundle在Activity之间传递数 ...
 
随机推荐
- 研究一下phpspider
			
官方文档 1.下载 官方github下载地址: https://github.com/owner888/phpspider 下载地址可能无法访问,这里提供一个网盘下载地址: 链接: https://p ...
 - vue 各种 import 引入
			
vue 各种 import 引入: https://www.jianshu.com/p/784e51ec68ce 阮一峰:http://es6.ruanyifeng.com/#docs/module
 - Hibernate入门教程(一):入门示例(Myeclipse)
			
●项目结构 ●本项目所用Hibernate版本为5.4.5.Final,导入jar只需lib目录下的required和MySQL所需的jar驱动 1.导入相关jar包(配置构建路径) 说明:本人已将所 ...
 - 在已有QT项目中添加多个UI布局界面
			
1.在工程中右键->添加新文件,按图选择 2.选择窗口部件 3.创建UI控制类 注意上图红框中命名按实际需要定义,否则后期改动要修改UI文件参数 4.修改UI文件,框1是窗口部件父类,框2是UI ...
 - Invoke-Obfuscation混淆ps文件绕过Windows_Defender
			
前提 powershell只能针对win7之后的系统,之前的win操作系统默认没有安装powershell. 所在目录:C:\Windows\System32\WindowsPowerShell\v1 ...
 - CentOS 7 安装详细步骤
			
VMware安装centos 7 前期准备: 1. VMware虚拟机软件(使用的是15x) 2. CentOS-7-x86_64-DVD-1810.iso 一.安装VMware虚拟机软件 略 二.新 ...
 - postgresql 取出分组中最大的几条数据
			
WITH Name AS ( SELECT * FROM ( SELECT xzqdm, , ) xzdm, COUNT (*) sl FROM sddltb_qc WHERE xzqdm ') GR ...
 - WPF textbox 鼠标滚动更新日期,text文本值更改
			
/// <summary> /// 选择日期 /// </summary> private void RQTxt_MouseWheel(object sender, Mouse ...
 - Oracle数据库创建与连接
			
一.Oracle数据库的安装 1.下载Oracle数据库 网址:Oracle 数据库软件下载 | Oracle 技术网 | Oracle 由于需要注册,所以我就没有采用这种下载方式, 右击该网页查看 ...
 - vue 非父子组件之间的传值(Bus/总线/发布订阅模式/观察者模式)
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...