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

安卓中实现序列化的接口有两个,一个是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 详解的更多相关文章

  1. 【转】C#中Serializable序列化实例详解

    这篇文章主要介绍了C#中Serializable序列化,以实例形式详细讲述了系列化的技术及各种序列化方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#中Serializable序列化.分 ...

  2. Android中Serializable和Parcelable序列化对象详解

    学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.P ...

  3. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  4. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  5. java 序列化Serializable 详解

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  6. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  7. Serializable详解(1):代码验证Java序列化与反序列化

    说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...

  8. 【Android】详解Android Service

    目录结构: contents structure [+] Service简单概述 Service在清单文件中的声明 Service启动服务 Service绑定服务 扩展Binder类 使用Messen ...

  9. Android——Android Bundle详解(转)

    Android Bundle详解 1 Bundle介绍 Bundle主要用于传递数据:它保存的数据,是以key-value(键值对)的形式存在的. 我们经常使用Bundle在Activity之间传递数 ...

随机推荐

  1. js 中 !!的用法

    !!是将表达式强制转化为bool值的运算,运算结果为true或false,表达式是什么值,结果就是对应的bool值,不再取非. 不是取非再取非的意思!!! !!false=false;    要注意f ...

  2. interleave two text files with specified lines

    a_file=$1 a_step=$2 b_file=$3 b_step=$4 a_start=1 let a_end=$a_start+$a_step b_start=1 let b_end=$b_ ...

  3. promise的基本用法

    // Promise 对象,可以保存状态 //Promise 第一步 // 异步代码 写在 Promise的函数中 第二步 const promise = new Promise((resolve, ...

  4. 使用mybatis进行一对多嵌套查询时出错:输出结果:Country{id=2, name='美国', minister=[null]}

    即Minister类作为Country类的关联属性. 查询的输出结果是:Country{id=2, name='美国', minister=[null]} <!--mapper.xml内容--& ...

  5. 转 MySQL乐观锁和悲观锁

    悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库 ...

  6. Machine code transfer into assembly code

    #include <stdio.h> const char shell[]="\x0f\x01\xf8\xe8\5\0\0\0\x0f\x01\xf8\x48\xcf" ...

  7. Oracle中删表遇到ORA-14452

    删表的时候碰到表忙的情况,会报错. DROP TABLE TMP_TAB_T_AGENT * ERROR at line 1: ORA-14452: attempt to create, alter ...

  8. Android开发:图文分析 Handler通信机制 的工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...

  9. 第四章 K8s部署安装

    一.kube-proxy开启ipvs的前置条件 //1.加载netfilter模块 modprobe br_netfilter //2.添加配置文件 cat > /etc/sysconfig/m ...

  10. ethtool---查看网卡

    ethtool 命令详解 命令描述: ethtool 是用于查询及设置网卡参数的命令. 使用概要:ethtool ethx       //查询ethx网口基本设置,其中 x 是对应网卡的编号,如et ...