我有序列化问题,无法找到原因。它是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;
的任何建议?
答案 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
}
}
}