当我们在开发Android App的时候,总会遇到这样的场景:我们在一个Activity(或者Fragment及其他)里创建了一个自定义类的对象,并把该对象的各个属性赋值,然后在跳转到另外一个Activity的时候想把这个对象传递过去。这时候我们需要的就是进行序列化,否则通过Intent是不能传递非序列化对象的。
在Android开发中,我们序列化对象一般有两种办法,即Serializable和Parcelable,其中前者是Java的一个接口,是通用的,而后者则是Google为Android特意设计的一个接口,只能在Android里使用。那么这二者在使用上有什么区别呢?
Serializable
位于java.io的路径下,显然是Java通用接口。实际上Serializable就是把Java对象序列化为二进制文件,然后进行传递就非常方便了(这里的传递包括进程之间,程序与网络之间,以及程序与本地存储之间)。使用起来相当简单,比如你自己写一个Person类,只要该类implements了Serializable接口就可以了。好了,这时候你的Person对象就已经实现了序列化,可以通过Intent对象随便跳转了。虽然按照规矩此时应该奉上一段示例代码,但实在是太简单了就算了。
Parcelable
通过Serializable接口实现的序列化虽然方便,但却有个“致命”的问题,那就是效率不高,而在这方面有着洁癖的Google表示不能忍,就给我们提供了更高效率的Parcelable,反正大部分开发人员序列化都是为了传递对象而不是保存在本地,使用Parcelable确实更高效。
import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable { public String name; public int age; public Person(Parcel in) { name = in.readString(); age = in.readInt(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(name); parcel.writeInt(age); } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { public Person createFromParcel(Parcel in) { return new Person(in); } public Person[] newArray(int size) { return new Person[size]; } }; }
实现了必要的describeContents和writeToParcel这2个方法之后,IDE还会提示你需要有一个CREATOR。需要注意的是,read与write这2个方法里面,属性的顺序必须是一致的,否则会出错。
Serializable与Parcelable的选择
如果确信该类只会通过Intent进行传递而不会保存到本地,那么Parcelable是更合适的选择,因为一切操作都在内存中且内存开销比较小,效率好。如果涉及到保存到本地或者网络传输,那么就用Serializable吧,这时候务必不要使用Parcelable,因为不同的Android版本Parcelable内部实现可能不同,进行数据持久化有可能会坑爹。如果有的同学不是很注重效率(毕竟现在手机配置高,性能很强),那么在任何时候都使用Serializable都可以,毕竟这样一定不会出错。
评论