Android开发笔记(二十七)对象序列化

什么是序列化程序中存储和传递信息,需要有个合适的数据结构,最简单的是定义几个变量,变量多了之后再分门别类,便成了聚合若干变量的对象。代码在函数调用时可以直接传递对象,但更多的场合例如与文件交互、与网络交互、组件之间交互等等,就无法直接使用未经处理的对象。因此Java引入了序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作。与之对应的是反序列化,反序列化是把一个字节
摘要由CSDN通过智能技术生成

什么是序列化

程序中存储和传递信息,需要有个合适的数据结构,最简单的是定义几个变量,变量多了之后再分门别类,便成了聚合若干变量的对象。代码在函数调用时可以直接传递对象,但更多的场合例如与文件交互、与网络交互、组件之间交互等等,就无法直接使用未经处理的对象。因此Java引入了序列化的概念,用于把一个对象转换为字节序列,然后再对这个字节序列做存储和传递操作。与之对应的是反序列化,反序列化是把一个字节序列恢复为Java对象的过程,而序列化是把Java对象转化为字节序列的过程。


Serializable

Serializable是Java设计用来定义序列化的接口,一个希望进行序列化的对象,需要实现Serializable接口。像上节《 Android开发笔记(二十六)Java的容器类》中介绍的Java容器类,从队列到映射,其实在各自的基类容器之外,也都实现了Serializable接口。也就是说,这些Java容器类其实都是可序列化的对象。另外,我们常见的变量类型如String、Integer等等,也实现了Serializable接口。既然这些对象都是可序列化的,那就可以把对象用IO写到文件里,之后再可以从文件里读出原对象,读出的变量值与之前的变量值是一样的。


实现简单的Serializable接口无需自己重写任何序列化函数,只要提供一个序列化版本的id(serialVersionUID),Java便会对这个对象进行高效的序列化操作。但由于Serializable方式使用了反射机制,使得序列化的过程相对较慢。并且,这种机制会在序列化的时候创建许多的临时对象,容易触发垃圾回收。


需要注意的是,Serializable序列化不保存静态变量,另外使用Transient关键字可声明对指定字段不做序列化。对于某些复杂的对象,也可以重写writeObject、readObject方法来自定义序列化过程,比如队列、映射这些容器类就重写了writeObject和readObject方法。


Parcelable

Parcelable的设计初衷,便是因为Serializable方式较耗资源且执行速度偏慢,为此Android设计了Parcelable用于组件之间的消息传递(包括线程间传递与进程间传递)。Parcelable数据仅在内存中存在,所以在内存间数据传输时推荐使用;而Serializable可将数据持久化方便保存,所以在需要保存文件或网络传输数据时应选择Serializable。


采用Parcelable方式的类,需要自己定义如何打包(写数据)和解包(读数据),其余的序列化操作则由底层实现。具体需要实现的方法如下:
writeToParcel(Parcel out, int flags) : 写数据
Parcelable.Creator<类名> CREATOR : 例行公事实现createFromParcel(读数据)和newArray
describeContents : 返回0即可


序列化对象的消息传递

下面是Serializ
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值