Android的对象序列化:Serializable 和Parcelable的区别

KaelLi 2017年5月9日14:18:56
评论
9,6521

当我们在开发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都可以,毕竟这样一定不会出错。

KaelLi
  • 本文由 发表于 2017年5月9日14:18:56
  • 转载请务必保留本文链接:https://www.kaelli.com/4.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: