Android序列化 Serializable Parcelable

序列化定义:将一个类对象转换成可存储、可传输状态的过程。序列化有两个过程:

1、序列化:将对象编码成字节流(serializing)
2、反序列化:从字节流编码中重新构建对象(deserializing)。对象序列化后,可以在进程内/进程间、网络间进行传输,也可以做本地持久化存储。

为什么要序列化: 系统底层并不认识对象,数据传输是以字节序列形式传递,以进程间通信为例,需要将对象转化为字节序列(字节序列中包括该对象的类型,成员信息等),然后在目标进程里通过反序列化字节序列,将字节序列转换成对象。

序列化方式:

Serializable 和 Parcelable
Serializable是通过inputstream和outputstream实现的,因此可以持久化,输出到文件等,需要声明serialVersionUID。

Serializable的序列化与反序列化分别通过 ObjectOutputStream 和 ObjectInputStream 进行,都是在Java层实现的。两个相关概念:
ObjectStreamClass: 序列化类的描述符。它包含类的名称和serialVersionUID。它由Java VM加载,可以使用lookup方法找到或创建。
ObjectStreamField: 类(可序列化)的可序列化字段的描述。ObjectStreamFields数组用于声明类的可序列化字段。

Serializable序列化过程(writeObject方法)

调用过程:writeObject() -> writeObject0()-> writeOrdinaryObject() -> writeSerialData() -> invokeWriteObject() -> defaultWriteFields()

反序列化过程(readObject方法)

调用过程:readObject() -> readObject0() -> readOrdinaryObject() -> readSerialData() -> defaultReadFields()


好处:可以持久化,可网络传输。Serializable是JDK的规则,具体的序列化 反序列化操作都是有jdk完成的。

坏处:可以参数使用了反射方式,用反射去获取类的属性、名字等等信息,因此效率低。序列化和反序列化会经过大量的I/O操作,产生大量的临时变量引起GC

Parcelable

序列化过程中会用到Parcel,Parcel可以被认为是一个包含数据或者对象引用的容器,能够支持序列化及在跨进程之后的反序列化。P的序列化操作在Native层实现,通过write内存写入及read读内存数据重新生成对象。P将对象进行分解,且分解后每一部分都是支持可传递的数据类型。

好处:android原生,快速。

问题:不能持久化,不能网络传输。Parcelable需要程序员来自己实现序列化与反序列化过程,所以Parcelable使用的时候效率要比Serializable高,但是使用的时候要比Serializable复杂(自己写代码)

 

另外序列化过程中的几个注意点:

下面两种成员变量不会参与到默认序列化过程中:
1、static静态变量属于类而不属于对象
2、transient标记的成员变量
参与序列化的成员变量本身也是需要可序列化的
反序列化时,非可序列化的(如被transient修饰)变量将会调用自身的无参构造函数重新创建,因此也要求此成员变量的构造函数必须是可访问的,否则会报错。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值