目录

Android开发之序列化那点事

一、前言

  • 序列化是什么东东呢?
  • 序列化有什么用呢?
  • 为什么要序列化呢?
  • 如何序列化呢?

二、序列化的理解

  • 序列化是将对象的状态信息转换为可以存储或者传输的形式的过程。
  • 有序列化,当然也就有反序列化

序列化:把对象转换为字节序列的过程称为序列化 反序列化:把字节序列恢复为对象的过程称为对象的反序列化

  • 序列化与反序列化的使用场景更多的是在:1、进程间通信 2、网络通信 3、对象存储
  • 当然,我们在进行Android开发是,遇到进程间通信时就需要进行序列化了。如你想通过Intent传递对象时,对象必须实现序列化接口。

三、Android中如何让对象获得序列化能力?

1、Serializable接口

  • Serializable是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。
  • 使用Serializable是相当简单的,我们只需要让类实现序列化接口并在类的声明中指定serialVersionUID即可自动实现序列化过程。
  • 可能大多是情况下我们都忽略了声明一个serialVersionUID,虽然不指定serialVersionUID也可以实现序列化过程,其实此时系统内部是根据当前类的成员变量等信息自动生成一个serialVersionUID。此时的serialVersionUID会因为类的修改而发生变化,这样会产生什么影响呢?
  • 要想知道会产生什么影响,我们应该先了解serialVersionUID在序列化和反序列化过程中的作用,当你理解知道,自然而然就会明白由此带来的影响的
serialVersionUID的作用
  • 在序列化的时候,系统会把当前类的serialVersionUID写入序列化文件中,在反序列化的时候,系统会去检测文件中的serialVersionUID是否与当前类的serialVersionUID一致,如果一致,说明序列化的类的版本和当前类的版本是一致的,如果serialVersionUID不一致,说明类被修改了,此时反序列化是失败的。
  • 假如我们只是类中新增了字段,我们还是希望反序列化能成功,那么此时我们应该如何处理的。
  • 很简单,我们只需要手动指定一个serialVersionUID即可。但是如果是类名发生了变化,或者原来字段的类型,此时还是会序列化失败的哦。

2、Parcelable接口

  • Parcelable接口是Android SDK提供的一种专门用于Android应用中对象的序列化和反序列化的方式,相比于Seriablizable具有更好的性能。实现Parcelable接口的对象就可以实现序列化并可以通过Intent和Binder传递。

  • 以下是使用Parcelable接口需要接触到的一些api

方法 功能 标记位
createFromParcel(Parcel in) 从序列化后的对象中创建原始对象
newArray(int size) 创建指定长度的原始对象数组
User(Parcel in) 从序列化后的对象中创建原始对象
writeToParcel(Parcel out,int flags) 将当前对象写入序列化结构中 PARCALABLE_WRITE_RETURN_VALUE
describeContents 返回当前对象的内容描述,几乎所有情况都返回0,仅在当前对象中存在文件描述符时返回1 CONTENTS_FILE_DESCRIPTOR
  • 既然Parcelable和Serializable都可以实现序列化并且可以用于Intent间的数据传递,那么两者有什么区别呢?
区别 Serializable Parcelable
所属API JAVA API Android SDK API
原理 序列化和反序列化过程需要大量的I/O操作 序列化和反序列化过程不需要大量的I/O操作
开销 开销大 开销小
效率 很高
使用场景 序列化到本地或者通过网络传输 内存序列化