我怎样才能优雅地序列化一个lambda?

例如,下面的代码抛出一个NotSerializableException.如何在不创建SerializableRunnable"虚拟"接口的情况下修复它?

public static void main(String[] args) throws Exception {
    File file = Files.createTempFile("lambda", "ser").toFile();
    try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
        Runnable r = () -> System.out.println("Can I be serialized?");
        oo.writeObject(r);
    }

    try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
        Runnable  r = (Runnable) oi.readObject();
        r.run();
    }
}

推荐答案

Java8引入了cast an object to an intersection of types by adding multiple bounds的可能性.因此,在序列化的情况下,可以编写:

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");

lambda自动实现了串行化.

Java相关问答推荐

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

为什么我的画布没有显示在PFA应用程序中?

更新我们的一个文物后出现了严重的符号引用错误

Cosmos Change Feed Process Lag远远超过收集中的记录数量

Java 8中的多个字段和计数

使用联接和分页的SpringBoot Spring数据JPA

';com.itextpdf.ext.html.WebColors已弃用

RichFaces 3.x-Spring Boot-迁移web.xml

在Spring Boot应用程序中导致";MediaTypeNotSupportdException&qot;的映像上载

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

测试何时使用Mockito强制转换对象会导致ClassCastException

MySQL数据库中未应用具有Spring数据的唯一约束

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

匹配一组字符或另一组字符

MimeMessage emlMessage=new MimeMessage(Session,emlInputStream);抛出InvocationTargetException

如何在JavaFX中处理多个按钮

组合连接以从两个表返回数据

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

由于可为null,无法在kotlin中实现java接口

如何使用Jackson读取以方括号开头的JSON?