序列化serializable和parcelable区别

序列化,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。

1.优劣

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的

Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。使用了反射,序列化的过程较慢

serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可。Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作。


Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下,不能很好的保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable 。

Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了

Parcelable的持久化存储是不稳定的,它会随着系统版本的不同而变化


2.使用

对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可


Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现

例如:

public class NewAddrIndia implements Parcelable {

//tag = 1

@SerializedName("addr")

publicStringaddr;

//tag = 2

@SerializedName("landmark")

publicStringlandmark;

//tag = 3

@SerializedName("city")

publicStringcity;

public static NewAddrIndia decode(byte[] bytes) throws IOException {

BufferedSource source =newBuffer().write(bytes);

ProtoReader reader =newProtoReader(source);

returndecode(reader);

}

public static NewAddrIndia decode(ProtoReader reader)throwsIOException {

NewAddrIndia result =newNewAddrIndia();

longtoken = reader.beginMessage();

for(inttag; (tag = reader.nextTag()) != -1; ) {

switch(tag) {

case1:

result.addr= ProtoAdapter.STRING.decode(reader);

break;

case2:

result.landmark= ProtoAdapter.STRING.decode(reader);

break;

case3:

result.city= ProtoAdapter.STRING.decode(reader);

break;

default:

reader.peekFieldEncoding().rawProtoAdapter().decode(reader);

break;

}

}

reader.endMessage(token);

returnresult;

}

@Override

public intdescribeContents() {

return0;

}

@Override

public void writeToParcel(Parcel dest,intflags) {

dest.writeString(this.addr);

dest.writeString(this.landmark);

dest.writeString(this.city);

}

public NewAddrIndia() {

}

protected NewAddrIndia(Parcel in) {

this.addr= in.readString();

this.landmark= in.readString();

this.city= in.readString();

}

public static final CreatorCREATOR=newCreator() {

@Override

public NewAddrIndia createFromParcel(Parcel source) {

return newNewAddrIndia(source);

}

@Override

public NewAddrIndia[] newArray(intsize) {

return newNewAddrIndia[size];

}

};

}

推荐阅读更多精彩内容