Serializable和Parcelable总结
前言
Android开发中难免会遇到对象序列化的场景,比如说将对象从一个Activity通过Intent传到另一个Activity,比如说存储到本地等等。大体的总结一下序列化的知识吧。
Serializable
意为“序列化的”意思
什么是序列化
- 序列化:把对象转换为字节序列的过程
- 反序列化:把字节序列转换为对象的过程
什么时候需要序列化
- 当你想把一个对象通过Intent传递到另一个Activity中
- 当你想把保存了一个详情页的对象缓存到本地文件或数据库中
- 当你想用socket在网络上传送对象的时候
- 。。。
怎样实现序列化
很简单,实现Serializable接口即可,但序列化机制使用了反射去构造序列化对象,性能较慢,创建了大量的临时对象,造成很大的GC
这里有几个基本点需要注意:
- 父类实现了序列化,子类就自动实现了序列化
- 父类没实现序列化,子类需要实现,主要显式的实现Serializable接口,父类中要有无参构造函数
- 序列化只保存对象的属性,不保存方法
- 对象的实例变量引用了其他对象,引用对象也需要序列化
- 关于是否要设置序列化ID
- 序列化不保存静态变量
- transient关键字可以使得字段不被序列化
贴个讲的不错的Serializable链接:Java序列化的高级认识
举两个接近项目实战的例子:
// 1 现在需要将一个论坛详情页的信息缓存到本地
// 将网络请求下来的数据缓存
// 网络请求基类
public class BaseResponseBean implements Serializable{public String status;public String errmsg;}// 论坛详情Bean, 只需继承基类
public class ForumsDetailBean extends BaseResponseBean {public String forumsId;public String forumsName;public String forumsLogo;public String forumsType;public String postCount;public String postReplyCount;public String lookCount;public String collectStatus;}// 2 现在做一个发布功能, 我们需要做一个草稿箱, 将这个未写完的内容缓存到本地
// 我用一个对象来保存草稿箱数据public class PublishData implements Serializable{public String id;public String title;public String content;// 图片视频列表public List<ImageVideoItem> list;}// 引用了ImageVideoItem的实例, 所以ImageVideoItem也得实现Serializable接口
public class ImageVideoItem implements Serializable{public String picUrl;public String picCompressUrl;public String videoUrl;public int width;public int height;public String desc;public String type;}
Parcelable
意为“包装、打包的”意思
// 序列化
@Override
public void writeToParcel(Parcel dest, int flags) {}// 反序列化public static final Creator<User> CREATOR = new Creator<User>() {@Overridepublic User createFromParcel(Parcel source) {return new User();}@Overridepublic User[] newArray(int size) {return new User[0];}
};// 描述
// 基本所有情况都返回0, 当前对象中存在文件描述符时返回1
@Override
public int describeContents() {return 0;
}
两者区别
- Serializable实现简单,只需实现一个接口。Parcelable使用起来比较麻烦,代码量多一些
- Serializable会使用反射,序列化和反序列化需要大量的I/O操作,并且创建了大量临时对象,造成大量GC,效率低一些。Parcelable是将一个完整的对象进行分解,效率更快,可能在10倍以上
- Serializable的一般是存储本地数据或者通过网络传输数据。Parcelable的一般在内存中使用,比如Intent,Bundle中传递数据等
总结
这只是简单的介绍了一下Serializable和Parcelable,将来用的多了有新的知识点了再总结一下
觉得不错的一篇文章:序列化Serializable和Parcelable的理解和区别
Serializable和Parcelable总结相关推荐
- 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程. 对象的反序列化:把字节序列恢复为Java对象的过程. (2) 序列化详细解释 ...
- Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable] 在Android中的不同Activity之间传递对象,我们可以考虑采用Bun ...
- [android] Serializable 和 Parcelable 区别
android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable. 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.通过序 ...
- Android Serializable与Parcelable原理与区别
2019独角兽企业重金招聘Python工程师标准>>> 一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程. 对 ...
- android对象序列化的方法,Android 进阶-两种序列化方式 Serializable 和 Parcelable
[导读]序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态 ...
- 序列化Serializable、Parcelable
序列化的概念: 所谓序列化就是将对象变成二进制流,便于存储和传输. 为什么要序列化和反序列化? 当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二 ...
- java parcelable_Java Serializable和Parcelable详解及实例代码
对 Serializable和Parcelable理解 1.首先他们两个接口都是为了实现对象的序列化,使之可以传递,所谓序列化就是将对象信息装换成可以存储的介质的过程. 2.Serializable是 ...
- android 保存 parcelable对象,Android 使用序列化Serializable和Parcelable
Android 序列化Serializable和Parcelable使用和区别 一:Serializable 1.什么是序列化 将一个类对象转换成可存储,可传输状态的过程. 2.什么是Serializ ...
- Android中的Serializable和Parcelable序列化
Serializable和Parcelable接口都可以完成对象的序列化过程,在Android中当我们需要通过Intent和Binder传输数据时,我们要传输的对象就需要使用Serializable和 ...
- java parcelable list_Android中Serializable和Parcelable序列化对象详解
学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.P ...
最新文章
- Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本
- linux自动安装跳过warning,linux 使用rpm安装软件时,遇到warning: rpmts_HdrFromFdno: Header V3...
- python flask 大文件 下载_flask - python上传大文件到服务器报错
- GARFIELD@02-24-2005
- win8下vs2012加wp8 sdk开发xna4.0PC游戏
- 分享一个文件上传工具类
- redis 高级实用教程
- 父组件给子组件传值方法_【Vue】小学生都能看懂的子父组件传值
- python 注销一大段_Django框架用户注销功能实现方法分析
- 计算机的正确使用方法,电脑开关机的正确的操作步骤顺序(不会对电脑造成任何损坏)...
- 如何利用PS动作一秒将字体生成逼真刺绣效果
- C#从剪贴板上获取图片
- 25行Java代码将普通图片转换为字符画图片和文本
- 解决Vscode使用LeetCode报错Failed to test the solution. Please open the output channel for details.
- dkp管理系统 php,RB!DKP v3.1.8 Build
- 2048小游戏js实现
- php 时间戳与日期的转换
- 【BDTC前瞻】公安部专家谈大数据安全与政策法规
- PyQt5 QDockWidget
- 如何使用BlindScanner共享打印一体机中的扫描功能