5
4

1 回答 1

11

您正在传递一个匿名内部类,act(...)该内部类对其父类具有隐式引用MyBuilder。我的猜测是,即使MyBuilderimplements 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 回答