2015-09-01 31 views
1

我有序列化问题,无法找到原因。这是在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?我插旗到VM参数为我JRE,但堆栈跟踪没有改变。重新启动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

+4

I t很简单:你有一个匿名类com.myprogram.main.Entity $ 1',它不是'Serializable'。你不需要扩展调试。 – EJP

+0

谢谢,但我不明白。我有'公共抽象类实体实现Serializable {...}'。 'java.io.ObjectOutputStream.writeObject(Object object)'用于工作,但从那以后我做了很多改变,现在我得到了错误。我相信我改变了一些东西,导致我的课“不可序列化”,所以我试图进行调试来跟踪它。 –

+0

此外,我读到'$ 1'通常指的是内部类的问题。我没有任何内部课程!我试图打开扩展调试的另一个原因。 –

回答

3

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

有关更多信息,请参阅How can I identify an anonymous inner class in a NotSerializableException

+0

这个答案是不能被接受的,因为这个例外没有明确指出这个问题是一个匿名的内部类。事实上,在例外情况下,任何地方都可以找到任何“匿名”,“内部”或“类”等字样。如果例外清楚地表明问题是一个匿名的内部类,那么它可能“非常简单”,我可能不需要发布这个问题。这个问题的可接受答案必须说明,如何从知道这个问题是一个匿名的内部类,而不是清楚地说明这个问题。 –

+0

@ lukas-eder在http://stackoverflow.com/a/12932191/852795做的很棒 –

-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 
    } 
    } 
} 
相关问题