2011-03-09 24 views
5

的設置ClassNotFoundException的上序列化類開始

我)的活動,只有覆蓋的onCreate()的onResume(和的onSaveInstanceState()。在的onSaveInstanceState(),我把一個序列化對象:

@Override 
    public void onSaveInstanceState(Bundle state) { 
     super.onSaveInstanceState(state); 
     state.putSerializable("obj", myObj); // myObj is of class MyClass    state.putLong("long", longVar); 
    } 

MyClass的本來是活動類中的內部類,但對於調試,我甚至把它移到一個單獨的文件:

public class MyClass implements Serializable { 
    private static final long serialVersionUID = 0x98ED2F00; 
    .... 
} 

步驟:

  1. 開始在通常的方法程序,它運行良好。
  2. 單擊主頁按鈕返回到啓動器。
  3. 在Eclipse中,在設備面板
  4. 啓動該程序再次從啓動停止的過程中,這個時候我得到以下幾點:

    了java.lang.RuntimeException:無法啓動活動ComponentInfo {com。示例.Reports}:java.lang.RuntimeException Parcelable遇到ClassNotFoundException,讀取一個可序列化的對象{name = com.example.MyClass}

    引起:java.lang.ClassNotFoundException:com.examp.MyClass在loader中dalvik.System.PathClassLoader [。]

線索和觀察:

  1. 最重要的線索是:如果我不救MyObj中的onSaveInstanceState中的(),然後一切都很好。而且,將任何原始類型放入Bundle都很好,但不是我的對象。

  2. 例外是我的代碼外扔,它發生的onCreate()和之間的onResume()。它發生在Android內部。

  3. 錯誤消息類名是正確的:com.example.MyClass。最初它是活動內的一個內部類,但爲了隔離問題,我將它移到了一個單獨的文件中,但是沒有用。

  4. 我認爲序列化的實施是正確的,因爲它可以從程序的其他部分文件被序列化到/。

有沒有人有任何可能的原因這樣的想法?非常感激! (對不起,我不能把詳細的代碼在這裏,因爲一切都在這裏交織和那裏。我只能分離出儘可能多的。)

回答

5

OK,我想我找到了解決這個問題。

原來,如果傳入的onCreate的savedInstanceState參數()不爲空,然後就必須反序列化包含在該包的任何對象。我不知道爲什麼,但這是我如何擺脫這個問題。最初我在onCreate()中的代碼具有在某些條件下的邏輯,我忽略savedInstanceState。現在我所做的只是它不是空的,我只是將所有東西反序列化,然後根據其他條件,我決定是否使用它們。

到目前爲止,它運行良好。但我不知道:

  1. 爲什麼我需要反序列化他們,如果我不,異常發生?

  2. Android爲反序列化我的東西,我把它放在savedInstanceState中是什麼?我的意思是,我明白Android可能會提供一些用於自己使用的信息,但爲什麼會出現並試圖反序列化我的東西?如果它知道它不知道如何使用它們?

+0

非常感謝您回來並報告您的解決方案。我無法想象要花多長時間才能弄清楚這一點,這一點並不明顯 – HXCaine 2011-11-10 20:48:45

1

我一直在爭取這個同樣的問題,我最終解決方式,它是實現Parceable,而不是Serializable在我的包藏起來的類。

我能夠通過在模擬器上使用DevTools應用程序(似乎無法在真實設備上工作)並更改要檢查的Development Settings > Immediately destroy activities來可靠地重現崩潰。在我的onSaveInstanceState中將我的自定義類更改爲Parceable並更改爲putParcelable似乎解決了此問題。

相關問題