【齐天的博客】转载请注明出处(万分感谢!):
https://blog.csdn.net/qijinglai/article/details/80813423

前言

Android中要实现对象持久化或者对象传输就一定会用到对象序列化的操作,Android中实现序列化的方式有两种,一种是实现Java中的Serializable接口,另一种是实现Android中的Parcelable接口。当然,既然Android专门提供了序列化接口,那么一定是Parcelable的效率会更高一点。下面我们分析一下这两种方式。

Serializable

它是Java提供的一个空接口,提供对象标准的序列化和反序列化操作,使用极简单。

使用

只需实现Serializable接口即可,可选择声明或不声明serialVersionUID,区别后面会说。

如何实现序列化和反序列化
//序列化
UserBean user = new UserBean();
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();//反序列化
ObjectInputStream in =new ObjectInputStream(new FileInputStream("cache.txt"));
UserBean newUser = (UserBean) in.readObject();
in.close();

serialVersionUID

原则上序列化后的数据要和当前类有相同的serialVersionUID,才能正常被反序列化。

工作机制
  1. 序列化时会把serialVersionUID也一起写入
  2. 反序列化时检测serialVersionUID是否一致
    ·若一致,则反序列化成功
    ·不一致,说明类发生了某种变化(如:变量少了一两个,变量多了一两个等等)
例子

当版本升级后,我们可能删除了某几个成员变量,这时候如果是制定了serialVersionUID我们就依然可以反序列化成功,使程序最大限度的恢复数据。
但是如果有毁灭性的改变,比如修改了类名,这样就完全不可能被反序列化了。

Parcelable

只要实现这个接口的类的对象,就可以实现序列化,并可以通过Intent和Binder传递。

public class User implements Parcelable{private int userId;private String userName;private boolean isMale;private Book book;public User(int userId, String userName, boolean isMale) {this.userId = userId;this.userName = userName;this.isMale = isMale;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel parcel, int i) {parcel.writeInt(userId);parcel.writeString(userName);parcel.writeInt(isMale?1:0);parcel.writeParcelable(book,0);}public static final Creator<User> CREATOR = new Creator<User>() {@Overridepublic User createFromParcel(Parcel in) {return new User(in);}@Overridepublic User[] newArray(int size) {return new User[size];}};protected User(Parcel in) {userId=in.readInt();userName=in.readString();isMale=in.readInt()==1;book=in.readParcelable(Thread.currentThread().getContextClassLoader());}}

模式都一样,这里只单独说一下Parcel,Parcel内部包装了可序列化的程序,可以再Binder中自由传输,在以后的IPC通信中将会用到。

总结

  • Serializable是Java中的接口,使用简单,但内部需要大量的IO操作,开销很大。
  • Parcelable是Android中的接口,使用麻烦,但效率很高

所以Android中首选Parcelable。Parcelable主要应用于在内存序列化上,但在存储设备及网络传输序列化时会显得太复杂,因此这两种情况使用Serilaizable会更好一些。

Android的序列化(Serializable和Parcelable)相关推荐

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

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

  2. Android中的Serializable和Parcelable序列化

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

  3. 序列化Serializable、Parcelable

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

  4. 序列化-Serializable和Parcelable的简单介绍

    序列化的本质 序列化是一种用来处理对象流的机制.序列化是为了解决在对对象流进行读写操作时所引发的问题. 序列化:将java对象转换成字节序列的过程,字节码可以保存到数据库.内存.文件等,也可用于网络传 ...

  5. android 序列化 xml serializable,关于Android中的序列化Serializable和Parcelable的学习

    简单地说,"序列化"就是将运行时的对象状态转换成二进制,然后保存到流,内存或者通过网络传输给其他端. 两者最大的区别在于 存储媒介的不同,Serializable使用 I/O 读写 ...

  6. 【Android基础】序列化 Serializable vs Parcelable

    Serializable public class SerializableDeveloper implements SerializableString name;int yearsOfExperi ...

  7. Android 序列化(Serializable和Parcelable),kotlin开发windows程序

    Parcelabel的实现,不仅需要实现Parcelabel接口,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口,并实现读写的抽象方法.如 ...

  8. Android 序列化(Serializable和Parcelable),android开发板底层开发

    实现Parcelable接口

  9. Android 序列化(Serializable和Parcelable)

最新文章

  1. android setlatesteventinfo 找不到,安卓通知的基本用法
  2. ide 波浪线_零基础学习Python_小波浪
  3. typescript继承和重写
  4. 使用脚本进行 SAP Spartacus 安装工作
  5. 如何扩大缓存区_艾莱依首个自动化仓落地,库宝解决线边缓存难题
  6. windows上安装使用mySql
  7. java log4j 多线程_针对log4j 1.2.15中的并发锁问题,到底是io瓶颈,还是锁竞争导致线程block?...
  8. Luogu1060 开心的金明
  9. 学计算机设计制图需啥基础,学习工程制图和CAD经验和方法 心得及体会
  10. 举例 微积分 拉格朗日方程_拉格朗日方程的应用及举例08讲(推荐文档)
  11. 用html做龙卷风特效,利用HTML5实现Canvas龙卷风特效
  12. 入行嵌入式开发若干年悟出的道理
  13. 算法—青蛙跳台阶问题汇总
  14. Iphone6/6s刷机常见问题
  15. linux debian iso下载,Debian GNU/Linux 9.8 “Stretch” live和DVD ISO现在可供下载
  16. 如何快速保存PPT中的图片资源
  17. 【Web_接口爬虫_Python3_豆瓣电影TOP50_threadingrequests】(豆瓣)电影TOP-50,多线程接口爬虫电影名称和地址,自动化测试案例
  18. Arduino IDE无法打开问题解决
  19. 大家好我是二龙山扛把子
  20. windows2008 iis7环境SSL部署https多站点

热门文章

  1. 电脑会员管理系统怎么弄,电脑会员卡管理系统怎么弄
  2. array_diff()和array_diff_assoc()
  3. 深入浅出LSTM学习
  4. Win10 内置 OpenSSH 使用密钥连不上的问题解决
  5. 多家机构宣布接入文心一言能力
  6. 最新vue实战视屏 vue2.x thinkPHP5.0后台 nodejs+mong0DB
  7. Al-learing数学基础,平均差,方差,协方差
  8. 公钥证书的颁发和使用
  9. Android应用开发详解【郭宏志】(奋斗之小鸟)_PDF 电子书
  10. 5.大型电商项目之创建前端展示模板并调用