bundle傳遞同時(shí)實(shí)現(xiàn)了Serializable和Parcelable的對(duì)象

最近在項(xiàng)目中兩個(gè)頁(yè)面的數(shù)據(jù)傳遞出了一個(gè)問(wèn)題,因?yàn)槎嗳碎_發(fā)的溝通穩(wěn)問(wèn)題刘离,有一個(gè)Data對(duì)象實(shí)現(xiàn)了兩個(gè)序列化接口Serializable和Parcelable,而它又有一個(gè)info成員對(duì)象只實(shí)現(xiàn)了Serializable接口刑峡,在從上一個(gè)頁(yè)面?zhèn)鬟f至下一個(gè)頁(yè)面的時(shí)候刻肄,我們使用put Serializable和get Serializable的方式取傳遞,結(jié)果info字段一直為空署海,后來(lái)查看源碼吗购,發(fā)現(xiàn)bundle在存儲(chǔ)對(duì)象的時(shí)候首先會(huì)判斷復(fù)雜一點(diǎn)的類型(String、Integer...)砸狞,然后判斷是不是實(shí)現(xiàn)了Parcelable捻勉,接著再判斷基本類型等等,最后才會(huì)判斷是不是實(shí)現(xiàn)了Serializable接口(效率最差刀森,使用了反射):

public final void writeValue(Object v) {
    if (v == null) {
        writeInt(VAL_NULL);
    } else if (v instanceof String) {
        writeInt(VAL_STRING);
        writeString((String) v);
    } else if (v instanceof Integer) {
        writeInt(VAL_INTEGER);
        writeInt((Integer) v);
    } else if (v instanceof Map) {
        writeInt(VAL_MAP);
        writeMap((Map) v);
    } else if (v instanceof Bundle) {
        // Must be before Parcelable
        writeInt(VAL_BUNDLE);
        writeBundle((Bundle) v);
    } else if (v instanceof Parcelable) {
        writeInt(VAL_PARCELABLE);
        writeParcelable((Parcelable) v, 0);
    } else if (v instanceof Short) {
        writeInt(VAL_SHORT);
        writeInt(((Short) v).intValue());
    } else if (v instanceof Long) {
        writeInt(VAL_LONG);
        writeLong((Long) v);
    } else if (v instanceof Float) {
        writeInt(VAL_FLOAT);
        writeFloat((Float) v);
    } else if (v instanceof Double) {
        writeInt(VAL_DOUBLE);
        writeDouble((Double) v);
    } else if (v instanceof Boolean) {
        writeInt(VAL_BOOLEAN);
        writeInt((Boolean) v ? 1 : 0);
    } else if (v instanceof CharSequence) {
        // Must be after String
        writeInt(VAL_CHARSEQUENCE);
        writeCharSequence((CharSequence) v);
    } else if (v instanceof List) {
        writeInt(VAL_LIST);
        writeList((List) v);
    } else if (v instanceof SparseArray) {
        writeInt(VAL_SPARSEARRAY);
        writeSparseArray((SparseArray) v);
    } else if (v instanceof boolean[]) {
        writeInt(VAL_BOOLEANARRAY);
        writeBooleanArray((boolean[]) v);
    } else if (v instanceof byte[]) {
        writeInt(VAL_BYTEARRAY);
        writeByteArray((byte[]) v);
    } else if (v instanceof String[]) {
        writeInt(VAL_STRINGARRAY);
        writeStringArray((String[]) v);
    } else if (v instanceof CharSequence[]) {
        // Must be after String[] and before Object[]
        writeInt(VAL_CHARSEQUENCEARRAY);
        writeCharSequenceArray((CharSequence[]) v);
    } else if (v instanceof IBinder) {
        writeInt(VAL_IBINDER);
        writeStrongBinder((IBinder) v);
    } else if (v instanceof Parcelable[]) {
        writeInt(VAL_PARCELABLEARRAY);
        writeParcelableArray((Parcelable[]) v, 0);
    } else if (v instanceof int[]) {
        writeInt(VAL_INTARRAY);
        writeIntArray((int[]) v);
    } else if (v instanceof long[]) {
        writeInt(VAL_LONGARRAY);
        writeLongArray((long[]) v);
    } else if (v instanceof Byte) {
        writeInt(VAL_BYTE);
        writeInt((Byte) v);
    } else if (v instanceof PersistableBundle) {
        writeInt(VAL_PERSISTABLEBUNDLE);
        writePersistableBundle((PersistableBundle) v);
    } else if (v instanceof Size) {
        writeInt(VAL_SIZE);
        writeSize((Size) v);
    } else if (v instanceof SizeF) {
        writeInt(VAL_SIZEF);
        writeSizeF((SizeF) v);
    } else {
        Class<?> clazz = v.getClass();
        if (clazz.isArray() && clazz.getComponentType() == Object.class) {
            // Only pure Object[] are written here, Other arrays of non-primitive types are
            // handled by serialization as this does not record the component type.
            writeInt(VAL_OBJECTARRAY);
            writeArray((Object[]) v);
        } else if (v instanceof Serializable) {
            // Must be last
            writeInt(VAL_SERIALIZABLE);
            writeSerializable((Serializable) v);
        } else {
            throw new RuntimeException("Parcel: unable to marshal value " + v);
        }
    }
}

最后將info類實(shí)現(xiàn)Parcelable接口就可以了踱启,項(xiàng)目中還是要注意,盡量不要這樣寫研底,優(yōu)先使用Parcelable(內(nèi)存讀取效率高)埠偿,需要持久化存儲(chǔ)再考慮Serializable。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榜晦,一起剝皮案震驚了整個(gè)濱河市冠蒋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乾胶,老刑警劉巖抖剿,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異识窿,居然都是意外死亡斩郎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門喻频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缩宜,“玉大人,你說(shuō)我怎么就攤上這事甥温《突停” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵姻蚓,是天一觀的道長(zhǎng)宋梧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)史简,這世上最難降的妖魔是什么乃秀? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任肛著,我火速辦了婚禮,結(jié)果婚禮上跺讯,老公的妹妹穿的比我還像新娘枢贿。我一直安慰自己,他們只是感情好刀脏,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布局荚。 她就那樣靜靜地躺著,像睡著了一般愈污。 火紅的嫁衣襯著肌膚如雪耀态。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天暂雹,我揣著相機(jī)與錄音首装,去河邊找鬼。 笑死杭跪,一個(gè)胖子當(dāng)著我的面吹牛仙逻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涧尿,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼系奉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姑廉!你這毒婦竟也來(lái)了萌踱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤限书,失蹤者是張志新(化名)和其女友劉穎虫蝶,沒(méi)想到半個(gè)月后章咧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倦西,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赁严,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扰柠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疼约,死狀恐怖卤档,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情程剥,我是刑警寧澤劝枣,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響溪胶,放射性物質(zhì)發(fā)生泄漏稳诚。R本人自食惡果不足惜哗脖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扳还。 院中可真熱鬧才避,春花似錦、人聲如沸氨距。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舆驶。三九已至橱健,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沙廉,已是汗流浹背拘荡。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撬陵,地道東北人珊皿。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巨税,于是被迫代替她去往敵國(guó)和親蟋定。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容