Android中的序列化:Parcelable和Serializable
概述
序列化:将一个对象转换成可存储
或可传输
的状态。
Parcelable和Serializable的区别 作用
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。
Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
性能比较
在内存的使用中,Parcelable的性能方面要强于Serializable;
Serializable序列化操作的时候会产生大量的临时变量(原因是使用了反射机制),从而导致GC的频繁调用,因而性能比Parcelable差;
Parcelable是以IBinder作为信息载体的。在内存上的开销比较小,因此内存直接进行数据传递的时候,Android推荐使用Parcelable;
在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过IO流的形式将数据写入到硬盘上。
选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如Activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为Android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。
Serializable的使用
对于Serializable的使用,类只需要实现Serializable接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class User implements Serializable { private static final long serialVersionUID = 123456789L ; private String uid; private String userName; private int age; }
Parcelable的使用
Parcelable的使用,需要实现writeToParcel
、describeContents
函数以及静态的CREATOR
变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class User implements Parcelable { private String uid; private String userName; private int age; @Override public int describeContents () { return 0 ; } @Override public void writeToParcel (Parcel dest, int flags) { dest.writeString(this .uid); dest.writeString(this .userName); dest.writeInt(this .age); } public User () { } protected User (Parcel in) { this .uid = in.readString(); this .userName = in.readString(); this .age = in.readInt(); } public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { @Override public User createFromParcel (Parcel source) { return new User(source); } @Override public User[] newArray(int size) { return new User[size]; } }; }
参考链接
Parcelable和Serializable的作用、效率、区别及选择
Android系统中Parcelable和Serializable的区别
序列化Serializable和Parcelable的理解和区别
Android中Serializable和Parcelable序列化对象详解
Serializable
Parcelable
java类中serialversionuid 作用 是什么?