【Android学习】Serializable和Parcelable

来源:互联网 发布:淘宝咨询电话是多少 编辑:程序博客网 时间:2024/06/04 01:12

1,Serializable

1)概念

Serializable接口:完成对象的序列化过程,提供标准的反序列化和序列化操作。
序列化接口Serializable没有方法或字段,仅用于标识可序列化的语义。

2)场景

实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。

Serializable将java对象序列化为二进制文件。

3)实现

①序列化

A.实现Serializable接口;
B.在类中声明如下标识:

private static final long serialVersionUID = 1L;

在反序列化的时候,这个标识和当前类版本相同,才可成功反序列化。

②读写

被序列化的类需要实现Serializable接口,使用ObjectInputStream和ObjectOutputStream进行对象的读写。

4)不能序列化的对象

①静态成员

静态成员变量属于类不属于对象。

② transient标记

被transient关键字标记的成员变量。

5)举例

①String实现了Serializable。
②File实现了Serializable。

2,Parcelable

1)概念

Parcelable接口同样提供对象的序列化过程。

Parcel被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。

3,Serializable、Parcelable对比

1)Parcelable

实现了Parcelable对象存放在内存中。
实现麻烦,效率高,主要用于内存序列化。
Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
在使用内存的时候,Parcelable比Serializable性能高。

2)Serializable

实现了Serializable对象存放在本地文件中。
用于将对象序列化到存储设备、将对象序列化后通过网络传输。

Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

4,应用

1)Intent传递

2)类的序列化

被序列化的类需要实现Serializable接口,使用ObjectInputStream和ObjectOutputStream进行对象的读写。

未实现此接口的类无法进行任何状态的序列化和反序列化。

类通过实现 java.io.Serializable 接口以启用其序列化功能。

3)场景

2,Parcelable

Parcel被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。