java中Serializable与Parcelable的使用

来源:互联网 发布:移动的网络机顶盒 编辑:程序博客网 时间:2024/06/07 05:41

java序列化:保存内存对象的状态,包括对象的属性值,但不包括方法和static变量(因为static修饰的变量是属于类而不隶属于对象),以及用transient关键字修饰的变量(transient是禁止序列化的标识,效果等同于static修饰的变量).

java反序列化:是与java序列化相对的,表示从磁盘或者其他介质中读取序列化对象的内容.

java序列化的应用场景:
  • 内存中的对象保存到磁盘文件中
  • 网络传输对象,比如Socket套接字传输
  • 通过RMI(Remote Method Invoke 远程方法调用)传输对象,如android中的AIDL
java如何实现序列化:
  • Serializable序列化的空接口,这个序列化很简单,类直接实现就可以了,记住要添加或者保留序列化版本号serialVersionUID,否则可能会造成反序列化失败.

  • Parcelable接口,android特有的序列化存储,传输效率高,需要实现里面的抽象方式,实现起来比较麻烦.


Serializable

这里写图片描述

这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述

结果分析:transient关键字修饰的members和staice修饰的code并未序列化,因此说明java序列化保存的是除static及transient关键字修饰的成员,需要注意的是上面的Address同样需要实现Serializable,否则会报序列化异常,另外Serializable序列化是可以继承的,即一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。

注意到上面程序中有一个 serialVersionUID,serialVersionUID是用来辅助序列化和反序列化过程的,原则上序列化后的对象中serialVersionUID只有和当前类的serialVersionUID相同才能够正常被反序列化,也就是说序列化与反序列化的serialVersionUID必须相同才能够使序列化操作成功。具体过程是这样的:序列化操作的时候系统会把当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会去检测文件中的serialVersionUID,判断它是否与当前类的serialVersionUID一致,如果一致就说明序列化类的版本与当前类版本是一样的,可以反序列化成功,否则失败并报出UID错误.


Parcelable

因为Serializable频繁的进行IO操作,在内存序列化上开销比较大,而内存资源对android系统尤其宝贵,因此android提供了Parcelable接口来实现序列化操作,Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如通过Intent在activity间传输数据,而Parcelable的缺点就使用起来比较麻烦。

这里写图片描述

这里写图片描述

这里写图片描述
这里写图片描述

原创粉丝点击