序列化在android中使用的频率非常高,尤其是在intent传递对象的时候。学习序列化非常有必要,在android中有二种序列化方式:

1、实现Serializable接口
2、实现Parcelable接口

1 为什么要将对象序列化?

打个比方:雨伞在不用的时候要把它缩短、折叠起来存放。用的时候要伸长,伸展开使用。在这个例子中:”缩短、折叠”属于序列化,为了方便保存。而”伸长,伸展”是反序列化,为了使用。

相信大家明白了,为什么要将对象序列化?在android中为了方便对象数据的存储和传输,需要将对象进行序列化。而使用的时候需要将序列化的对象反序列化。以下是需要序列化的情况:

 1、永久性保存对象,保存对象的字节序列到本地文件中;2、用过序列化对象在网络中传递对象;3、通过序列化对象在进程间传递对象。

2 二种序列方法的介绍和对比

Serializable Parcelable
简单易用 用起来比较麻烦
速度慢 速度快
频繁使用产生垃圾太多 频繁使用产生垃圾较少

我们对二者进行了性能测试,下面我们来看一下测试结果

2.1 测试方法

1.通过将一个对象放到一个bundle里面然后调用Bundle#writeToParcel(Parcel, int)方法来模拟传递对象给一个activity的过程,然后再把这个对象取出来。
2.在一个循环里面运行1000 次。
3.两种方法分别运行10次来减少内存整理,cpu被其他应用占用等情况的干扰。
4.参与测试的对象就是上面代码中的SerializableDeveloper 和 ParcelableDeveloper。
5.在多种Android软硬件环境上进行测试
LG Nexus 4 – Android 4.2.2
Samsung Nexus 10 – Android 4.2.2
HTC Desire Z – Android 2.3.3

2.2 结果

我们对上面的图总结一下:

手机 Serializable Parcelable 效率
Nexus 10手机 1.0004ms 0.0850ms 提升10.16倍
Nexus 4手机 1.8539ms 0.1824ms 提升11.80倍
Desire Z手机 5.1224ms 0.2938ms 提升17.36倍

由此可以得出: Parcelable 比 Serializable快了10多倍。有趣的是,即使在Nexus 10这样性能强悍的硬件上,一个相当简单的对象的序列化和反序列化的过程要花将近一毫秒。

你可以想想,传递一个对象就需要1秒,如果传一个对象列表呢,直接卡住不动了!!如果你想成为一个优秀的软件工程师,你需要多花点时间来实现 Parcelable ,因为这将会为你对象的序列化过程快10多倍,而且占用较少的资源。

3 Serializable讲解

Serializable用起来非常简单,您只需要实现Serializable 接口即可。

public class SerializableDeveloper implements SerializableString name;public String getName() {return username;}
}

就是这么简单!不多介绍了,我们着重介绍Parcelable。

4 Parcelable 讲解

4.1 使用步骤

使用Parcelable我们分2步来做:

1.实现Parcelable接口,并实现接口中的两个方法:public int describeContents();public void writeToParcel(Parcel dest, int flags);
第一个方法是内容接口描述,默认返回0就可以了
第二个方法是将我们的对象序列化一个Parcel对象,也就是将对象中的数据存入Parcel中。2.实例化静态内部对象CREATOR实现接口Parcelable.Creator,实例化CREATOR时要实现其中的两个方法,其中createFromParcel的功能就是从Parcel中读取我们的对象。
也就是说我们先利用writeToParcel方法写入对象,再利用createFromParcel方法读取对象,因此这两个方法中的读写顺序必须一致,否则会出现数据紊乱!

4.2 代码案例

MyData 类代码如下:

public class MyData implements Parcelable {public MyData(){}private String username;private String nickname;private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/*** 这里的读的顺序必须与writeToParcel(Parcel dest, int flags)方法中写的顺序一致,否则数据会有差错!* 比如你的读取顺序如果是:* nickname = source.readString();* username=source.readString();* age = source.readInt();* 即调换了username和nickname的读取顺序,那么你会发现你拿到的username是nickname的数据,而你拿到的nickname是username的数据*/public MyData(Parcel source) {username = source.readString();nickname = source.readString();age = source.readInt();}/*** 这里默认返回0即可*/@Overridepublic int describeContents() {return 0;}/*** 把值写入Parcel中* 注意:在构造方法中要按照顺序读。*/@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(this.username);dest.writeString(this.nickname);dest.writeInt(this.age);}public static final Creator<MyData> CREATOR = new Creator<MyData>() {/*** 供外部类反序列化本类数组使用*/@Overridepublic MyData[] newArray(int size) {return new MyData[size];}/*** 从Parcel中读取数据*/@Overridepublic MyData createFromParcel(Parcel source) {return new MyData(source);}};
}

传递序列化数据

Intent intent = new Intent(MainActivity.this,StudyActivity.class);
MyData md = new MyData();
md.setUsername("yyd");
md.setNickname("nnnn");
md.setAge(12);
intent.putExtra("data", md);
startActivity(intent);

接收序列化数据

TextView tv = new TextView(this);
MyData md = getIntent().getParcelableExtra("data");
tv.setText("username: "+md.getUsername()+"  nickName:"+md.getNickname()+"   age:"+md.getAge());

5结尾

本章讲解了android序列化的2种方法,推荐大家使用Parcelable,因为它性能上比较好,这也是做为一个优秀的软件工程师必须掌握的东西。

在技术上我依旧是个小渣渣,加油,勉励自己!

android序列化讲解相关推荐

  1. Android序列化:Serializable Parcelable

    原文出处:http://blog.csdn.net/jdsjlzx/article/details/51122109?locationNum=14&fps=1 对于Parcel的理解: 在An ...

  2. Android序列化与反序列化

    1. 什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他 ...

  3. Android | 序列化Serializable/Parcelable 使用总结

    本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流. 文章目录 一.什么是序列化?为什么要序列化?怎么进行序列化? 二.Serializable 2.1 序列化举例 2.2 重写 ...

  4. android对象序列化,Android序列化总结

    前言 公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:"大爷,太极这玩意儿花拳绣腿,你练它干啥?"老者淡淡一笑:"年轻人,你还没有领悟到太极的真 ...

  5. Android序列化(二) 之 Parcelable

    1 简介 在Android组件间或者跨进程组件间要传递数据都是通过使用 Intent.putExtra() 或者 Bundle.putXXXExtra()方法进行,这些方法无法支持传递对象的引用,而只 ...

  6. android 序列化_Android高级架构进阶之数据传输与序列化

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本篇文章将从以下几个内容来阐述数据传输与序列化: [Serializable原理 ...

  7. android序列化异常,关于序列化:错误:Android中的序列化和反序列化

    每次单击按钮时,我都试图保存数据并将其存储在历史记录列表中. 尝试序列化和反序列化数据时出现错误.我不知道我在做什么错. 我能够添加到历史记录列表中,但是当我返回上一个活动并返回时,数据将不持久.在这 ...

  8. Android序列化的存储和读取

    Android中序列化的实现有两种方式:Serializable接口和Parcelable接口,本文对这两种方式进行简单的总结和使用. 一.相关概念 (一)序列化的原因(序列化能实现的效果) 1.永久 ...

  9. android 数据库 字节数组,java - 如何使用活动的android序列化字节数组并将其存储到数据库中? - 堆栈内存溢出...

    我有一个图像作为byte[] ,我需要将此图像保存在数据库中. 我为此使用Active Android库. 我知道db中用于此目的的数据类型应该是BLOB. 我知道byte[]不能直接存储,我知道它应 ...

最新文章

  1. python opencv 视频剪辑
  2. javascript捕获ocx事件
  3. 学习笔记:ORACLE 性能优化求生指南
  4. 【Hadoop Summit Tokyo 2016】Hivemall: Apache Hive/Spark/Pig 的可扩展机器学习库
  5. 《计算机图形学》2.2.2 光栅扫描显示处理器
  6. [转]Installing Memcached on Windows
  7. C# 中的占位符本质
  8. localStorage本地存储数组、读取、修改、删除
  9. 读《突然就走到了西藏》 | 保持呼吸,继续向前
  10. 在面向服务的设计时有四个原则:
  11. Google Code Review 处理代码审查中的推回
  12. 基于Python的房价影响因素分析
  13. Unity Shader - PBR相关公式及代码
  14. 在Windows系统上对hfds中的文件进行操作
  15. python计算时间间隔_python计算时间差
  16. github优秀项目分享 redis客户端
  17. SPSS——数据预处理
  18. 手机的短消息实现目前有三种方法(转)
  19. 十进制转换成十六进制小程序(强制转换和移位运算符)
  20. Flutter Decoration背景设定(边框、圆角、阴影、形状、渐变、背景图像等)

热门文章

  1. USB OTG学习笔记
  2. Figma#7:布局
  3. easypoi 动态获取表头
  4. 解决nw.js中无法播放mp3音频问题
  5. Nginx实现URL重写
  6. SSM项目遇到的问题(1)
  7. C语言学习笔记---初始C语言001
  8. 计算机高级语言c高起专阶段性作业2,高起专 网络教育计算机基础1考试试题及答案...
  9. 公众号排名被动引流 I 关键词的初始排名,认证与不认证公众号区别有多大?
  10. 移动端 touch事件 过渡事件 动画事件