android java.io.NotSerializableException序列化異常
阿新 • • 發佈:2019-01-10
今天被這個異常坑了好幾個小時。首先把我的需求說下。。今天要開發一個底部Tabbar。但是Tabbar的資料和數量都是在服務端傳過來,然後我們在通過資料繪製Tabbar,
繪製完後需要把這段資訊儲存序列化儲存在本地。以免下次網路不好的時候,我們而已直接在本地拿資料來繪製Tabbar。
好了,搞了2個小時。程式碼全部寫好了,準備開始測試的時候,在序列化物件的時候一直出爆錯
java.io.NotSerializableException:
com.logansoft.zcbao.fragment.menu.control.TabbarData;,,沒錯,就是一直爆錯
java.io.NotSerializableException:
com.logansoft.zcbao.fragment.menu.control.TabbarData;。。。。。。
大家發現了一個什麼問題了沒有。我明明序列化的是TabbarEntity。為什麼會告訴我無法序列化,TabbarData這個類呢。搞了好久看了原始碼才發現,原來這個序列化有一個毛病。。就是在序列化之前不能被其他物件間接或者直接引用,否者就會連使用到的被使用的那個物件也一併序列化。。
--------------------------------下面貼一段我的程式碼
//構建url和bitmap String[] url=new String[tabList.size()]; Bitmap[] selectIcon=new Bitmap[tabList.size()]; Bitmap[] unSelectIcon=new Bitmap[tabList.size()]; for (int i = 0; i <tabList.size(); i++) { url[i]=tabList.get(i).getTabUrl(); selectIcon[i]= BitMapUtil.getBitmapToResource(context,Integer.parseInt(tabList.get(i).getTabIcon())); unSelectIcon[i] = BitMapUtil.getBitmapToResource(context,Integer.parseInt(tabList.get(i).getTabSelectIcon())); } //放進底部例項 BottomViewItem.getInstance().setUrl(url); BottomViewItem.getInstance().setSelectIcon(selectIcon); BottomViewItem.getInstance().setUnSelectIcon(unSelectIcon);//這裡序列化的時候,在上面已經被BottomViewItem,和Bitmap引用到了,所以在序列化的時候也會一併把其他都序列化了。<span style="font-size:18px;">TabbarEntity tabbarEntity=new TabbarEntity(); List<TabbarEntity.AppTabListBean> tabList=new ArrayList<TabbarEntity.AppTabListBean>(){}; for (int i = 0; i < 4; i++) { //構造顯示資料 TabbarEntity.AppTabListBean appTabBean=new TabbarEntity.AppTabListBean(); appTabBean.setTabTitle(defaultText[i]); appTabBean.setTabIcon(images_unselected[i] + ""); appTabBean.setTabSelectIcon(image_selected[i] + ""); appTabBean.setTabUrl(default_tabbar_url[i]); tabList.add(appTabBean); } <span style="white-space:pre"> </span>把下面的紅色加升的序列化程式碼移到這裡。。好了解決了<span style="white-space:pre"> </span></span><pre name="code" class="java"><span style="font-size:24px;color:#ff0000;"><span style="white-space:pre"> </span><span style="background-color: rgb(51, 204, 0);">serializeTabbarData(tabbarEntity);</span></span>
---------------------------------
然後來總結下。。
下次在序列化物件的時候,一定要在物件構造完後。先序列化,在被其他物件引用裡面的值,否者他們就會有關聯關係,。。。。。