设置

我有一个仅覆盖onCreate(),onResume()和onSaveInstanceState()的 Activity 。在onSaveInstanceState()中,我放入了一个可序列化的对象:

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

MyClass最初是 Activity 类内部的一个内部类,但是为了调试,我什至将其移至单独的文件中:
public class MyClass implements Serializable {
    private static final long serialVersionUID = 0x98ED2F00;
     ....
}

步骤:
  • 以通常的方式启动程序,它运行正常。
  • 单击“主页”按钮返回到启动器。
  • 在Eclipse中,从“设备”面板中停止该过程
  • 从Launcher再次启动程序,这次我得到以下信息:

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

    由以下原因引起:java.lang.ClassNotFoundException:加载程序dalvik.System.PathClassLoader [。]中的com.examp.MyClass。

  • 线索和观察结果:
  • 最重要的线索是:如果我不将myObj保存在onSaveInstanceState()中,那么一切都很好。并且,将任何原始类型放入Bundle中都可以,但是不能使用我的对象。
  • 该异常被抛出到我的代码之外,它发生在onCreate()和onResume()之间。它发生在Android内部。
  • 错误消息中的类名称正确:com.example.MyClass。最初,它是 Activity 内部的一个内部类,但是为了找出问题所在,我将其移至单独的文件中,但无济于事。
  • 我相信Serializable的实现是正确的,因为它可以与程序其他部分的文件进行序列化。

  • 有人知道造成这种情况的任何可能原因吗?非常感激! (对不起,我无法在此处放置详细的代码,因为在这里和那里,一切都交织在一起。我只能尽可能地隔离。)

    最佳答案

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

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

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

  • 为什么必须对它们进行反序列化,如果没有,则会发生异常?
  • Android正在做什么以反序列化我保存在saveInstanceState中的内容?我的意思是,我了解Android可能已经提供了一些信息供自己使用,但是为什么它会尝试反序列化我的东西呢?如果知道不知道如何使用它们?
  • 关于android - Activity 开始期间可序列化类的ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5252841/

    10-12 05:52