猿问

如何序列化lambda?

如何序列化lambda?

我怎样才能优雅地序列化一个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();
    }}


慕后森
浏览 835回答 3
3回答

红糖糍粑

Java 8引入了通过添加多个边界将对象强制转换为类型的交集。..因此,在序列化的情况下,可以编写:Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");而lambda自动成为可串行化的。

噜噜哒

同样的构造也可作为方法参考。例如,此代码:import java.io.Serializable;public class Test {     static Object bar(String s) {         return "make serializable";     }     void m () {         SAM s1 = (SAM & Serializable) Test::bar;         SAM s2 = (SAM & Serializable) t -> "make serializable";     }     interface SAM {         Object action(String s);     }}定义具有可序列化目标类型的lambda表达式和方法引用。

拉丁的传说

很丑的演员。我更喜欢为我使用的函数接口定义一个可序列化的扩展例如:interface&nbsp;SerializableFunction<T,R>&nbsp;extends&nbsp;Function<T,R>,&nbsp;Serializable&nbsp;{}interface&nbsp;SerializableConsumer<T>&nbsp;extends&nbsp;Consumer<T>,&nbsp;Serializable&nbsp;{}然后,可以将接受lambda的方法定义为:private&nbsp;void&nbsp;someFunction(SerializableFunction<String,&nbsp;Object>&nbsp;function)&nbsp;{ &nbsp;&nbsp;&nbsp;...}调用函数,您可以传递您的lambda没有任何丑陋的演员:someFunction(arg&nbsp;->&nbsp;doXYZ(arg));
随时随地看视频慕课网APP

相关分类

Java
我要回答