日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一人一猫旅行记之浅析序列化及原理

發(fā)布時(shí)間:2023/12/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一人一猫旅行记之浅析序列化及原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在Activity跳轉(zhuǎn)的時(shí)候,往往需要傳遞一個(gè)對象。不像String等基本類型,可以直接通過Intent的putExtra方法將數(shù)據(jù)加到Bundle中,換句話說對象并不是計(jì)算機(jī)可以識別的類型。

這樣的話就涉及到了一個(gè)概念,序列化。
什么是序列化呢?序列化就是將對象轉(zhuǎn)成可以存儲或者傳遞的形式的過程,反序列化也是一個(gè)相反的過程,也就是將序列化后的數(shù)據(jù)轉(zhuǎn)換成對象的一個(gè)過程。

Java與安卓分別提供了一種序列化的方法(Serializable和Parcelable)
那么二有什么區(qū)別呢?
1,Serializable會涉及到反射,產(chǎn)生大量的臨時(shí)變量,這會引起系統(tǒng)頻繁的GC
2,Serializable由JDK完成轉(zhuǎn)換,而Parcelable則是自己完成序列化和反序列化,這就導(dǎo)致前者的效率要遠(yuǎn)低于后者。安卓之所以設(shè)計(jì)Parcelable的初衷就是Serializable效率過慢,為了在組件之間或者不同APP之間提高數(shù)據(jù)的傳輸速度,才設(shè)計(jì)了Parcelable。
3,如果當(dāng)數(shù)據(jù)要存儲在磁盤而不是內(nèi)存中,Parcelable無法保證在外部環(huán)境發(fā)生變化時(shí)的連續(xù)性。
因此,在Android的組件或者APP之間傳遞數(shù)據(jù),選擇Parcelable。如果想要保存數(shù)據(jù)或者在網(wǎng)絡(luò)上傳輸則選擇Serializable。

二者在使用上也有很大的區(qū)別:
首先,對于Serializable來說使用非常簡單,只需要讓對象實(shí)現(xiàn)Serializable接口即可

我們可以看到Serializable這個(gè)接口是一個(gè)空的接口,這是怎么回事呢?
其實(shí)Serializable只是增加一個(gè)標(biāo)識,在寫入或者讀取的時(shí)候會根據(jù)這個(gè)標(biāo)識進(jìn)行對應(yīng)的處理,我們看到上面的注釋涉及到幾個(gè)類,咱們就看一下ObjectOutputStream中的源碼。

private void writeObject0(Object obj, boolean unshared)throws IOException{<-省略部分代碼->// ----- BEGIN android -----if (obj instanceof Class) {writeClass((Class) obj, unshared);} else if (obj instanceof ObjectStreamClass) {writeClassDesc((ObjectStreamClass) obj, unshared);// ----- END android -----} else if (obj instanceof String) {writeString((String) obj, unshared);} else if (cl.isArray()) {writeArray(obj, desc, unshared);} else if (obj instanceof Enum) {writeEnum((Enum) obj, desc, unshared);} else if (obj instanceof Serializable) {writeOrdinaryObject(obj, desc, unshared);} else {if (extendedDebugInfo) {throw new NotSerializableException(cl.getName() + "\n" + debugInfoStack.toString());} else {throw new NotSerializableException(cl.getName());}}} finally {depth--;bout.setBlockDataMode(oldMode);}}

從上面的代碼應(yīng)該可以明白,如果一個(gè)類加了Serializable標(biāo)識,則會調(diào)用writeOrdinaryObject(obj, desc, unshared);
如果繼續(xù)往下閱讀代碼的話,會走到如下的方法中:

private void writeSerialData(Object obj, ObjectStreamClass desc)throws IOException{ObjectStreamClass.ClassDataSlot[] slots = desc.getClassDataLayout();for (int i = 0; i < slots.length; i++) {ObjectStreamClass slotDesc = slots[i].desc;if (slotDesc.hasWriteObjectMethod()) {PutFieldImpl oldPut = curPut;curPut = null;SerialCallbackContext oldContext = curContext;if (extendedDebugInfo) {debugInfoStack.push("custom writeObject data (class \"" +slotDesc.getName() + "\")");}try {curContext = new SerialCallbackContext(obj, slotDesc);bout.setBlockDataMode(true);slotDesc.invokeWriteObject(obj, this);bout.setBlockDataMode(false);bout.writeByte(TC_ENDBLOCKDATA);} finally {curContext.setUsed();curContext = oldContext;if (extendedDebugInfo) {debugInfoStack.pop();}}curPut = oldPut;} else {defaultWriteFields(obj, slotDesc);}}}

看到這相信就知道為什么Serializable的效率會低了吧?

然后,對于Parcelable來說,它的使用相對比較復(fù)雜,因?yàn)樗枰覀兪謩訉?shí)現(xiàn)序列化與反序列化的方法。
我們創(chuàng)建一個(gè)Person.java,實(shí)現(xiàn)Parcelable,會提示增加兩個(gè)方法和Parcelable的實(shí)現(xiàn),其實(shí)分別對應(yīng)Parcelable的三個(gè)過程(描述、序列化、反序列化)

@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeInt(age);dest.writeString(name);}@Overridepublic int describeContents() {return 0;}

上面是要實(shí)現(xiàn)的兩個(gè)方法,describeContents一般不需要處理,如果有一些需要特殊處理的數(shù)據(jù)的話則返回1。writeToParcel則是序列化的過程。

public static final Creator<Person> CREATOR = new Creator<Person>() {@Overridepublic Person createFromParcel(Parcel in) {return new Person(in);}@Overridepublic Person[] newArray(int size) {return new Person[size];}};

createFromParcel中返回一個(gè)Person對象,也就是反序列化的實(shí)現(xiàn)。

在前面咱們提到了序列化跟反序列化只是一個(gè)過程,所以無論Serializable還是Parcelable只是一種實(shí)現(xiàn)方式,我們還可以通過很多其他的方式來實(shí)現(xiàn),比如JSON、XML,甚至用字符串也可以實(shí)現(xiàn)。

總結(jié)

以上是生活随笔為你收集整理的一人一猫旅行记之浅析序列化及原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。