问问题
5309 次
1 回答
11
您正在传递一个匿名内部类,act(...)
该内部类对其父类具有隐式引用MyBuilder
。我的猜测是,即使MyBuilder
implements Serializable
,由于对另一个不是的对象的引用Serializable
(例如java.io.PrintStream
堆栈跟踪指示的 a ),它实际上也不能被序列化。
使您FileCallable<String>
的静态内部类实例摆脱对其父级的隐式引用:
private static class MyFileCallable implements FileCallable<String> {
private static final long serialVersionUID = 1L;
@Override
public String invoke(File file, VirtualChannel channel) throws IOException, InterruptedException {
if (file.getAbsoluteFile().exists()){
return file.getName() + " exists.";
} else {
return file.getName() + " doesn't exist.";
}
}
}
然后改用它:
String result = fp.act(new MyFileCallable());
更新: 这是 Java 的嵌套类教程的链接,该教程概述了内部类的实例与其封闭的外部类实例之间的关系:
InnerClass 的实例只能存在于 OuterClass 的实例中,并且可以直接访问其封闭实例的方法和字段。
JLS( §8.1.3 内部类和封闭实例)中也用更多技术术语解释了这一点。
Serializable
考虑到这一点,文档中的这句话解释了您遇到的原因NotSerializableException
:
在遍历图时,可能会遇到不支持 Serializable 接口的对象。在这种情况下,NotSerializableException 将被抛出,并将识别不可序列化对象的类。
于 2013-08-01T23:27:24.540 回答