活动开始期间可序列化类的ClassNotFoundException

时间:2011-03-09 22:09:37

标签: android

设置

我有一个只覆盖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. 停止该过程
  5. 从Launcher再次启动程序,这次我得到以下内容:

    java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.Reports}:java.lang.RuntimeException Parcelable遇到ClassNotFoundException读取可序列化对象{name = com.example.MyClass}

    引起:java.lang.ClassNotFoundException:加载器中的com.examp.MyClass dalvik.System.PathClassLoader [。]

  6. 线索和观察:

    1. 最重要的线索是:如果我没有在onSaveInstanceState()中保存myObj,那么一切都很好。并且,将任何原始类型放入Bundle中都很好,但不是我的对象。

    2. 异常抛出我的代码之外,它发生在onCreate()和onResume()之间。它发生在Android内部。

    3. 错误消息中的类名是正确的:com.example.MyClass。最初它是活动中的一个内部类,但为了隔离问题,我把它移到一个单独的文件中,但没有用。

    4. 我相信Serializable的实现是正确的,因为它可以序列化到程序的其他部分的文件中。

    5. 有没有人知道可能的原因?非常感激! (对不起,我不能在这里放置详细的代码,因为一切都在这里和那里交织在一起。我只能尽可能地隔离。)

2 个答案:

答案 0 :(得分:5)

好的,我想我找到了解决这个问题的方法。

事实证明,如果传入onCreate()的savedInstanceState参数不为null,那么必须反序列化该Bundle中包含的任何对象。我不知道为什么,但这就是我摆脱这个问题的方法。最初我在onCreate()中的代码有逻辑,在某些情况下,我忽略savedInstanceState。现在我所做的只要它不是空的,我只是将所有内容反序列化,然后,根据其他条件,我决定是否使用它们。

到目前为止它运行良好。但我不知道:

  1. 为什么我必须将它们反序列化,如果不这样做,会发生异常?

  2. 我在做什么来反序列化我放在savedInstanceState中的东西?我的意思是,我知道Android可能已经为自己的用途提供了一些信息,但为什么会出现并尝试反序列化我的东西呢?如果它知道它不知道如何使用它们?

答案 1 :(得分:2)

我一直在和同样的问题作斗争,我最终解决它的方法是在我收藏在Bundle中的类中实现Parceable而不是Serializable

通过在模拟器上使用DevTools应用程序(似乎无法在真实设备上运行)并更改要检查的Development Settings > Immediately destroy activities,我能够可靠地重现崩溃。将我的自定义类更改为Parceable并更改为putParcelable中的onSaveInstanceState似乎可以解决问题。