今天遇到一個問題:
用intent傳遞一個arraylist<object>祈惶,object里面有一個接口對象火鼻,當(dāng)然也繼承了Serializable接口公般。當(dāng)我把初始化arraylist方法寫成靜態(tài)方法就可以傳遞,寫成成員方法踪区,就無法傳遞,始終報錯吊骤。無法序列化缎岗。異常如下:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
我把接口對象改成實體對象后就沒有異常了。
百度許久也不知為何白粉。
個人感覺是靜態(tài)方法把對象以及其內(nèi)的接口對象也序列化了传泊,動態(tài)方法卻只能序列化該對象和其內(nèi)的實體對象,其內(nèi)接口對象并沒有序列化鸭巴。導(dǎo)致異常眷细。(有讀者知道具體原因可以留言告訴我。)
最后只能用靜態(tài)方法來實現(xiàn)鹃祖,用廣播機制通知后續(xù)處理方法溪椎。
后續(xù),補充:
此問題一直在我腦子里恬口,所以我又在網(wǎng)上搜索關(guān)于接口是否可以序列化的問題校读。終于發(fā)現(xiàn)此貼參考此貼,見2樓分析祖能。原來是因為實現(xiàn)接口我用的是內(nèi)部類的方式歉秫。非靜態(tài)內(nèi)部類會隱含保存一個指向其外部類實例的引用。序列化估計會有問題养铸。
后面我將會新建一個非內(nèi)部類來測試此問題雁芙。待續(xù)轧膘。。兔甘。
后續(xù)2:找到原因之后谎碍,我果斷把接口的實現(xiàn)改為了外部類,經(jīng)測試果然沒有異常了洞焙。
總結(jié):
1.其實標(biāo)題的arraylist與本文的核心無關(guān)蟆淀,筆者被網(wǎng)上的一些帖子誤導(dǎo)了。文章標(biāo)題應(yīng)該改為《intent傳遞非靜態(tài)內(nèi)部類出現(xiàn)java.lang.RuntimeException: Parcelable encountered IOException writing serializable object 的問題》
2.接口對象也不是重點闽晦,重點是非靜態(tài)內(nèi)部類扳碍。
3.其實我用靜態(tài)方法初始化時候,內(nèi)部類是靜態(tài)的仙蛉,從而被序列化了笋敞。
4.非靜態(tài)內(nèi)部類序列化會出問題,請謹(jǐn)慎使用\瘛:幌铩!