简介
java
中的 Serializable
,Externalizable
接口,Android
中的Parcelable
都是为序列化和反序列化提供的,一致的认为是在 Android
中推荐使用Parcelable
,因为效率更高.
Java
Serializable
Java
中的Serializable
接口是一个标记接口,通过ObjectOutputStream
和ObjectInputStream
进行序列化和反序列化.其中我们需要知道的一些内容包括:
serialVersionUID
用于标记序列化对象版本,不一致会反序列化失败,推荐使用 1L。- 静态变量不参与序列化(
序列化保存的是对象的状态,静态变量属于类的状态
) - 要想将父类对象也序列化,就需要让父类也实现
Serializable
接口。 - 使用
transient
关键字可以使得字段不被序列化 writeObject
和readObject
可在序列化和反序列化过程中作加密操作- 多次写入同一对象时,出第一次外,之后只保存写的引用。
writeObject()
与readObject()
都是private
方法,因此Serializable
采用了反射机制。- 如果我们和
Parcelable
一样来自己实现写入和读取,Serializable
的速度更快!
Externalizable
是 JDK
中提供的又一个序列化接口,与 Serializable
不同的是,需要我们自己实现 writeExternal
和 readExternal
来完成序列化,而不像 Serializable
有默认的 defaultReadObject
和 defaultWriteObject
。
writeReplace& readResolve
一: 一般的调用顺序为:writeReplace – > writeObject –> readObject –> readResolve
二: 无论是实现Serializable
接口,或是Externalizable
接口,当从I/O
流中读取对象时,readResolve
方法都会被调用到,单例类一般需要复写这个.
三: 可以在序列化之前通过 writeReplace
将需要进行序列化的对象换成我们指定的对象.
四: 可以在readResolve
方法中替换反序列化出来的对象(不是刚刚序列化回来的对象).
Android
Parcel& Parcelable
参考文章:Android - Parcel & Parcelable
总结
Serializable
为了保存对象的属性到本地文件、数据库、网络流、rmi、或者在应用程序间传递- 而
Parcelable
是为Android
程序间(AIDL
)高效的传输数据而设计 - 内存间数据传输时推荐使用
Parcelable
,而数据持久化推荐使用Serializable
,因为android
不同版本Parcelable
可能不同 - 如果和
Parcelable
一样来自己实现写入和读取,Serializable
的速度更快