Android序列化接口Parcelable与Serializable接口对比
小尹编码中... 人气:0Parcelable
优点:
- google专门为安卓写的序列化接口
- 性能好,内存开销小,效率高,写起来复杂
缺点:
- 各个机型可能有差异,Parcelable使用会产生差异
- 通讯组件之间(AIDL ,INTENT)的数据传递,可以使用Parcelable
- 写入存储设备推荐使用Serializable
public class MyParcelable implements Parcelable { * private int mData;//参数 * public int describeContents() {//类描述,一般不管他 * return 0; * } * public void writeToParcel(Parcel out, int flags) {//序列化 :out写入参数,要注明参数类型 flag一般默认是0,1代表对象需要返回,不回收 * out.writeInt(mData); * } * public static final Parcelable.Creator<MyParcelable> CREATOR//反序列化操作 * = new Parcelable.Creator<MyParcelable>() { * public MyParcelable createFromParcel(Parcel in) { * return new MyParcelable(in); * } * public MyParcelable[] newArray(int size) { * return new MyParcelable[size]; * } * }; * private MyParcelable(Parcel in) { * mData = in.readInt(); * } * }
google官方也是很贴心呀,直接把怎么用放在源码的注释里了
Serializable
优点:
- java自带的序列化接口
- Serializable是一个空接口,使用简单,是一个标识,会给类一个序列化UID
缺点:
- 因为使用的是反射,使用性能差,内存开销大
package java.io; // Android-added: Notes about serialVersionUID, using serialization judiciously, JSON. public interface Serializable { }
Serializable 是一个空接口,用来标识当前类可以被 ObjectOutputStream序列化,以及被ObjectInputStream反序列化
Parcelable与Serializable的性能比较
- 在内存的使用中,Parcelable在性能方面要强于Serializable
- Serializable在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色
- Parcelable是以Ibinder作为信息载体的,在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable
- 在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上
- 虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化 (原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)
总结:
- Java应用程序中有Serializable来实现序列化操作
- Android中有Parcelable来实现序列化操作
- 在Android中除了对数据持久化的时候需要使用到Serializable来实现序列化操作,其他的时候我们仍然需要使用Parcelable来实现序列化操作
- 在Android中效率并不是最重要的,而是内存, 通过比较Parcelable在效率和内存上强于Serializable
个人小建议:
尽管Parcelable实现起来比较复杂,但是如果我们想要成为一名优秀的Android软件工程师,那么我们就需要勤快一些去实现Parcelable,而不是偷懒与实现Serializable,当然实现Serializable也可以
加载全部内容