android序列化讲解
序列化在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序列化讲解相关推荐
- Android序列化:Serializable Parcelable
原文出处:http://blog.csdn.net/jdsjlzx/article/details/51122109?locationNum=14&fps=1 对于Parcel的理解: 在An ...
- Android序列化与反序列化
1. 什么是java序列化,如何实现java序列化? 我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他 ...
- Android | 序列化Serializable/Parcelable 使用总结
本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流. 文章目录 一.什么是序列化?为什么要序列化?怎么进行序列化? 二.Serializable 2.1 序列化举例 2.2 重写 ...
- android对象序列化,Android序列化总结
前言 公园里,一位仙风鹤骨的老者在打太极,一招一式都仙气十足,一个年轻人走过去:"大爷,太极这玩意儿花拳绣腿,你练它干啥?"老者淡淡一笑:"年轻人,你还没有领悟到太极的真 ...
- Android序列化(二) 之 Parcelable
1 简介 在Android组件间或者跨进程组件间要传递数据都是通过使用 Intent.putExtra() 或者 Bundle.putXXXExtra()方法进行,这些方法无法支持传递对象的引用,而只 ...
- android 序列化_Android高级架构进阶之数据传输与序列化
更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 本篇文章将从以下几个内容来阐述数据传输与序列化: [Serializable原理 ...
- android序列化异常,关于序列化:错误:Android中的序列化和反序列化
每次单击按钮时,我都试图保存数据并将其存储在历史记录列表中. 尝试序列化和反序列化数据时出现错误.我不知道我在做什么错. 我能够添加到历史记录列表中,但是当我返回上一个活动并返回时,数据将不持久.在这 ...
- Android序列化的存储和读取
Android中序列化的实现有两种方式:Serializable接口和Parcelable接口,本文对这两种方式进行简单的总结和使用. 一.相关概念 (一)序列化的原因(序列化能实现的效果) 1.永久 ...
- android 数据库 字节数组,java - 如何使用活动的android序列化字节数组并将其存储到数据库中? - 堆栈内存溢出...
我有一个图像作为byte[] ,我需要将此图像保存在数据库中. 我为此使用Active Android库. 我知道db中用于此目的的数据类型应该是BLOB. 我知道byte[]不能直接存储,我知道它应 ...
最新文章
- python opencv 视频剪辑
- javascript捕获ocx事件
- 学习笔记:ORACLE 性能优化求生指南
- 【Hadoop Summit Tokyo 2016】Hivemall: Apache Hive/Spark/Pig 的可扩展机器学习库
- 《计算机图形学》2.2.2 光栅扫描显示处理器
- [转]Installing Memcached on Windows
- C# 中的占位符本质
- localStorage本地存储数组、读取、修改、删除
- 读《突然就走到了西藏》 | 保持呼吸,继续向前
- 在面向服务的设计时有四个原则:
- Google Code Review 处理代码审查中的推回
- 基于Python的房价影响因素分析
- Unity Shader - PBR相关公式及代码
- 在Windows系统上对hfds中的文件进行操作
- python计算时间间隔_python计算时间差
- github优秀项目分享 redis客户端
- SPSS——数据预处理
- 手机的短消息实现目前有三种方法(转)
- 十进制转换成十六进制小程序(强制转换和移位运算符)
- Flutter Decoration背景设定(边框、圆角、阴影、形状、渐变、背景图像等)