【问题标题】:java.io.NotSerializableException with "$1" after class类后带有“$1”的 java.io.NotSerializableException
【发布时间】:2015-09-01 07:26:10
【问题描述】:

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

09-01 00:06:24.414: W/System.err(9961): java.io.NotSerializableException: com.myprogram.main.Entity$1
09-01 00:06:24.414: W/System.err(9961):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
09-01 00:06:24.414: W/System.err(9961):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
09-01 00:06:24.414: W/System.err(9961):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
09-01 00:06:24.414: W/System.err(9961):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
09-01 00:06:24.415: W/System.err(9961):     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)

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

-Dsun.io.serialization.extendedDebugInfo=true

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? 的输出。

我知道com.myprogram.main.Entity$1 不可序列化。这很容易。问题是为什么?关于我如何解决这个 java.io.NotSerializableException 的任何建议?

【问题讨论】:

  • 这很简单:你有一个匿名类 com.myprogram.main.Entity$1 不是 Serializable. 你不需要扩展调试。
  • 谢谢,但我不明白。我有public abstract class Entity implements Serializable {...}java.io.ObjectOutputStream.writeObject(Object object) 以前可以工作,但从那以后我做了很多更改,现在我得到了错误。我相信我所做的更改使我的课程“不可序列化”,所以我正在尝试调试以追踪它。
  • 另外,我读到$1 通常是指内部类的问题。我没有任何内部类!我尝试打开扩展调试的另一个原因。
  • 已修复。我没有意识到 Runnable() 是一个内部类。您的标题对将来研究此问题的任何人都完全没有帮助。我会再次修复。
  • A Runnable 不是内部类。 实现 Runnable 的匿名内部类是匿名内部类。如果它实现了任何其他接口,或者扩展了任何其他类,或者即使它没有实现,也一样。与Runnable 本身 无关。很高兴你在一场战斗之后找到了更好的头衔。

标签: java android debugging serialization


【解决方案1】:

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

请参阅How can I identify an anonymous inner class in a NotSerializableException 了解更多信息。

【讨论】:

  • 这个答案不能被接受,因为异常确实明确指出问题是匿名内部类。事实上,在例外的任何地方都找不到“匿名”、“内在”或“阶级”这样的词。如果异常清楚地表明问题是匿名内部类,那么它可能“非常简单”,我可能不需要发布这个问题。这个问题的一个可接受的答案必须表明人们如何从一个没有清楚地说明这一点的异常中知道问题是一个匿名内部类。
【解决方案2】:

要使用不可序列化的匿名内部类解决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 对象,那么您仍然会遇到问题(您可以将它们设为瞬态来解决此问题),但如果您不需要(例如它们是 Runnables),那么只需在何时实例化需要这样:

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
    }
  }
}

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 2023-01-12
    • 2013-04-10
    • 2020-03-11
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多