序列化铁坎,表示將一個對象轉(zhuǎn)換成可存儲或可傳輸?shù)臓顟B(tài)碳抄。序列化后的對象可以在網(wǎng)絡(luò)上進行傳輸,也可以存儲到本地舌稀。
1.優(yōu)劣
Serializable的作用是為了保存對象的屬性到本地文件啊犬、數(shù)據(jù)庫、網(wǎng)絡(luò)流壁查、rmi以方便數(shù)據(jù)傳輸觉至,當然這種傳輸可以是程序內(nèi)的也可以是兩個程序間的。
Serializable在序列化的時候會產(chǎn)生大量的臨時變量睡腿,從而引起頻繁的GC语御。使用了反射,序列化的過程較慢
serializable的迷人之處在于你只需要對某個類以及它的屬性實現(xiàn)Serializable 接口即可席怪。Serializable 接口是一種標識接口(marker interface)沃暗,這意味著無需實現(xiàn)方法,Java便會對這個對象進行高效的序列化操作何恶。
Parcelable的設(shè)計初衷是因為Serializable效率過慢孽锥,為了在程序內(nèi)不同組件間以及不同Android程序間(AIDL)高效的傳輸數(shù)據(jù)而設(shè)計,這些數(shù)據(jù)僅在內(nèi)存中存在细层,Parcelable是通過IBinder通信的消息的載體惜辑。
Parcelable不能使用在要將數(shù)據(jù)存儲在磁盤上的情況,因為Parcelable在外界有變化的情況下盛撑,不能很好的保證數(shù)據(jù)的持續(xù)性。盡管Serializable效率低點,但此時還是建議使用Serializable 。
Parcelable方式的實現(xiàn)原理是將一個完整的對象進行分解婚瓜,而分解后的每一部分都是Intent所支持的數(shù)據(jù)類型,這樣也就實現(xiàn)傳遞對象的功能了
Parcelable的持久化存儲是不穩(wěn)定的胡陪,它會隨著系統(tǒng)版本的不同而變化
2.使用
對于Serializable,類只需要實現(xiàn)Serializable接口,并提供一個序列化版本id(serialVersionUID)即可
Parcelable則需要實現(xiàn)writeToParcel、describeContents函數(shù)以及靜態(tài)的CREATOR變量,實際上就是將如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實現(xiàn)
例如:
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];
}
};
}