java.io.NotSerializableException with" $ 1"下课以后

时间:2015-09-01 07:26:10

标签: java android debugging serialization

我有序列化问题,无法找到原因。它是Eclipse中的Android应用程序,它给了我一个非常无益的堆栈跟踪:

-Dsun.io.serialization.extendedDebugInfo=true

找到Java flag to enable extended Serialization debugging info我决定设置

com.myprogram.main.Entity$1

How can I specify the default JVM arguments for programs I run from eclipse?之后,我将标志插入我的JRE的VM参数,但堆栈跟踪没有改变。重新启动Eclipse没有帮助。所以在Editing the vm args of eclipse之后我将标志添加到了我的eclipse.ini中,但堆栈跟踪仍未改变。我希望输出看起来像java.io.NotSerializableException – but where is the field?

我知道java.io.NotSerializableException不可序列化。这很容易。问题是为什么?关于我如何找出这个border-spacing: 0;的任何建议?

2 个答案:

答案 0 :(得分:4)

您有一个不是ListView的匿名内部类com.myprogram.main.Entity$1这在异常中有明确说明。 Serializable.表示它是生成异常的内部或静态嵌套类。 $后面的数字表示该类是匿名的,否则这里将出现内部类的名称。 $进一步表明这是1中的第一个匿名内部类。

有关详情,请参阅How can I identify an anonymous inner class in a NotSerializableException

答案 1 :(得分:-1)

要使用不可序列化的匿名内部类解决java.io.NotSerializableException,您可以删除匿名并在必要时实例化对象,这样就无需序列化该类。

而不是:

class Entity implements Serializable {
  public static void main(String[] args) {
    new Object() { }; // Entity$1 <- anonymous inner class
  }
}

这样做:

class Entity implements Serializable {
  public static void main(String[] args) {
    private class MyClass { } // Entity$MyClass <- inner class
  }
}

如果你需要序列化MyClass对象,那么你仍然有问题(你可以让它们瞬态来解决这个问题),但如果你不需要(例如它们是Runnable s)那么只是在需要时实例化,如下所示:

class Entity implements Serializable {
  public static void main(String[] args) {
    ...
    myHandler = new Handler();
    myHandler.postDelayed(new MyRunnable(), 1000);
    ...
    private class MyRunnable implements java.lang.Runnable {
      // runnable code
    }
  }
}