Android中的对象序列化方法

一、什么是对象序列化

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

二、什么地方用到对象序列化

  1. 永久性保存对象,保存对象的字节序列到本地文件中;
  2. 对象在网络中传递;
  3. 对象在IPC间传递,具体在Android,比如Activity之间传递对象数据,Service和Activity之间传递数据等。

三、Android中对象序列化的使用

在Android中我们经常会在组件之间传递数据,比如一个Activity启动另一个Activity时要传递过去一些数据,或者Activity和Service之间通讯时传递一些数据,一般我们会把数据存放到Intent中传递过去,Intent的putExtra可以传递基本数据类型和String类型,但是要传递整个对象的话,就需要用到对象序列化。

四、化常用三种对象序列化方式

  1. 实现Serializable接口
  2. 实现Externalizable接口
  3. 实现Parcelable接口

五、实现

(一)Serializable

  1. 实现步骤:
    • implements Serializable接口
    • 设置serialVersionUID
  2. 注意问题
    • Serializable是一个标记接口,事实上不用实现任何方法。
    • 假如实体类中成员变量被 transient 关键字修饰,该成员变量将不会被序列化, transient 只能修饰变量,不能修饰方法和类。
    • serialVersionUID相当于版本号,在Android中并不能明确看出其作用,因为基本都是在本地进行序列化和反序列化(解析),对象描述一般是同一个文件,但是当序列化用于网络传输时,当服务器升级,此时服务器和客户端上的实体类描述可能会不相同,如何判断服务器和本地实体类描述是否相同呢?就是根据serialVersionUID来判断的,因此serialVersionUID实际上相当于版本号的作用,在反序列化开始阶段,首先就是判断serialVersionUID是否相同,不相同将停止解析。同样,如果当对实体类进行了较大改动,也应该提高serialVersionUID。
    • 如果实体类中的成员变量也是对象的话,序列化的时候这个对象也会被序列化,依次类推。
    • 序列化并不保存静态变量
    • 要想将父类对象也序列化,就需要让父类也实现Serializable 接口。如果父类不实现的话的,就需要有默认的无参的构造函数。

(二)Externalizable

  1. 实现步骤
    • 实现Externalizable接口的类,必须定义不带参数的构造函数
    • implements Externalizable接口
    • 实现writeExternal方法,写入数据
    • 实现readExternal方法,读取数据
  2. 注意问题
    • 由于Externalizable继承自Serializable,因此Serializable的注意事项Externalizable也要注意
    • 写入和读出的顺序必须一致

(三)Parcelable

  1. 实现步骤
    • implements Parcelable接口
    • 实现describeContents方法,默认返回0即可
    • 实现writeToParcel,写数据
    • 提供一个静态的实现Parcelable.Creator接口的对象常量引用且常量名为CREATOR,其中要重写两个方法:
      • createFromParcel(Parcel in) 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
      • newArray(int size) 创建一个类型为T,长度为size的数组,一般是return new T[size]即可,该方法是供外部类反序列化本类数组使用。
  2. 注意问题
    • 写入是通过writeToParcel函数,读取是通过Parcelable.Creator接口中的方法完成的。

六、三种方法的区别和联系

  • Serializable是Java SE中的方法,大部分的对象序列化都是采用这种方式,由于其实现是采用反射机制,因此会产生大量临时变量,因此能引起频繁GC。
  • Externlizable继承自Serializable,与Serializable不同,Externlizable是一种可控的序列化方式,由于写入和读取的方法由我们控制,因此我们可以在写入和读取的时候进行一些数据处理,有必要的话可以将不属于本类成员的数据也存储。
  • Parcelable是Android自带的序列化接口,它实际上是借助Parcel(Android中存放读取数据的容器)进行数据传输的,因此效率更高,但是由于Parcel不是一个通用的序列化方式,因此Parcelable不适合文件存储的操作,但是IPC时效率高于Serializable。下面是在不同Android设备上进行1000次序列化和反序列化时Parcelable和Serializable性能对比:

    Parcelable和Serializable性能对比

七、示例

https://github.com/LKylin/ObjectSerialization/tree/master

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值