前言

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总结相关推荐

  1. 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别

    一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程. 对象的反序列化:把字节序列恢复为Java对象的过程. (2) 序列化详细解释 ...

  2. ​Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

    Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable] 在Android中的不同Activity之间传递对象,我们可以考虑采用Bun ...

  3. [android] Serializable 和 Parcelable 区别

    android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable. 一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中: 2.通过序 ...

  4. Android Serializable与Parcelable原理与区别

    2019独角兽企业重金招聘Python工程师标准>>> 一.序列化.反序列化是什么? (1) 名词解释 对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程. 对 ...

  5. android对象序列化的方法,Android 进阶-两种序列化方式 Serializable 和 Parcelable

    [导读]序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态 ...

  6. 序列化Serializable、Parcelable

    序列化的概念: 所谓序列化就是将对象变成二进制流,便于存储和传输. 为什么要序列化和反序列化? 当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二 ...

  7. java parcelable_Java Serializable和Parcelable详解及实例代码

    对 Serializable和Parcelable理解 1.首先他们两个接口都是为了实现对象的序列化,使之可以传递,所谓序列化就是将对象信息装换成可以存储的介质的过程. 2.Serializable是 ...

  8. android 保存 parcelable对象,Android 使用序列化Serializable和Parcelable

    Android 序列化Serializable和Parcelable使用和区别 一:Serializable 1.什么是序列化 将一个类对象转换成可存储,可传输状态的过程. 2.什么是Serializ ...

  9. Android中的Serializable和Parcelable序列化

    Serializable和Parcelable接口都可以完成对象的序列化过程,在Android中当我们需要通过Intent和Binder传输数据时,我们要传输的对象就需要使用Serializable和 ...

  10. java parcelable list_Android中Serializable和Parcelable序列化对象详解

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

最新文章

  1. Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本
  2. linux自动安装跳过warning,linux 使用rpm安装软件时,遇到warning: rpmts_HdrFromFdno: Header V3...
  3. python flask 大文件 下载_flask - python上传大文件到服务器报错
  4. GARFIELD@02-24-2005
  5. win8下vs2012加wp8 sdk开发xna4.0PC游戏
  6. 分享一个文件上传工具类
  7. redis 高级实用教程
  8. 父组件给子组件传值方法_【Vue】小学生都能看懂的子父组件传值
  9. python 注销一大段_Django框架用户注销功能实现方法分析
  10. 计算机的正确使用方法,电脑开关机的正确的操作步骤顺序(不会对电脑造成任何损坏)...
  11. 如何利用PS动作一秒将字体生成逼真刺绣效果
  12. C#从剪贴板上获取图片
  13. 25行Java代码将普通图片转换为字符画图片和文本
  14. 解决Vscode使用LeetCode报错Failed to test the solution. Please open the output channel for details.
  15. dkp管理系统 php,RB!DKP v3.1.8 Build
  16. 2048小游戏js实现
  17. php 时间戳与日期的转换
  18. 【BDTC前瞻】公安部专家谈大数据安全与政策法规
  19. PyQt5 QDockWidget
  20. 如何使用BlindScanner共享打印一体机中的扫描功能

热门文章

  1. 酒会女主角html5游戏在线玩,宝石之轮《GTA5》线上连续喝100瓶酒会怎么样?男女主角差距确实大!...
  2. iOS进阶4 -- 动画总结
  3. i510600k配什么主板
  4. 华为手机访问文件服务器,手机访问云服务器文件
  5. 删除的照片怎么找回?教你5个好方法快速恢复
  6. 2.11 Nginx控制浏览器缓存
  7. 如何打开本地用户和组
  8. 未来最高明的数据恢复师
  9. PHP 屏幕亮度,win10屏幕亮度调不了怎么办
  10. 中国消费者嘴上喊着买国产手机,行动上却在抢购苹果