1. 程式人生 > >android java.io.NotSerializableException序列化異常

android java.io.NotSerializableException序列化異常

今天被這個異常坑了好幾個小時。首先把我的需求說下。。今天要開發一個底部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這個類呢。搞了好久看了原始碼才發現,原來這個序列化有一個毛病。。就是在序列化之前不能被其他物件間接或者直接引用,否者就會連使用到的被使用的那個物件也一併序列化。。

--------------------------------下面貼一段我的程式碼

<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>
//構建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引用到了,所以在序列化的時候也會一併把其他都序列化了。
serializeTabbarData(tabbarEntity); tabbarEntity.setAppTabList(tabList);

---------------------------------

然後來總結下。。

下次在序列化物件的時候,一定要在物件構造完後。先序列化,在被其他物件引用裡面的值,否者他們就會有關聯關係,。。。。。