【问题标题】:Serialize Java functions in Java 8 [duplicate]在 Java 8 中序列化 Java 函数 [重复]
【发布时间】:2016-12-04 13:45:36
【问题描述】:

我正在尝试创建一个模拟程序堆栈的类。是否有可能使这个类serializable?我希望能够将其用作Akka 消息。谢谢!

public class ProgramStack<T>{

    public final Queue<UnaryOperator<T>> programStack;
    private T context;

    ProgramStack(Queue<UnaryOperator<T>> programStack, T context) {
        this.programStack = programStack;
        this.context = context;
    }

    public void next() {
        UnaryOperator function = programStack.poll();
        function.apply(context);
    }

    public boolean hasNext() {
        return !programStack.isEmpty();
    }

}

【问题讨论】:

  • 你必须实现 Serializable 接口。你可以在这里看到docs.oracle.com/javase/8/docs/technotes/guides/serialization
  • 谢谢@AshwaniTiwari 我不知道如何使 UnaryOperator 可序列化。
  • UniaryOperator 类中是否有内部类?如果没有,你只有 UniaryOperator 实现了 Serializable

标签: java serialization lambda java-8 akka


【解决方案1】:

如果你不序列化方法,你序列化具有行为的对象。无论如何,为了能够序列化,您必须实现 Serializable。它的所有成员都必须这样做。如果您查看文档https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html Queue 没有实现 Serializable,请确保任何对象实现 Queue 都是可序列化的。我不知道 T 必须是什么,但它还必须实现 Serializable 才能序列化您的 ProgramStack 类型的对象。

【讨论】:

  • 感谢@Javant!我认为问题是 UnaryOperator 不可序列化。
  • UnaryOperator 是一个接口。 Queue 也是如此。重要的是具体对象在某种程度上实现了Serializable。 (例如,LinkedListSerializable 并实现了 Queue)重复的答案显示了如何序列化 lambda/函数引用。
  • @dwong 你需要做的就是在你的类声明中声明&lt;T extends Serializable&gt;,然后确保添加到Queue结构中的所有对象都通过转换为(UnaryOperator &amp; Serializable)来声明
  • @4castle 非常感谢。它有效!
  • @4castle 不太正确。你不能只是通过强制转换来使某些东西可序列化。您展示的转换所做的是提供一个目标类型,如果转换对象是 lambda 或方法 ref,它将产生一个实现 UnaryOperatorSerializable 的对象。或者,您可以创建一个新接口 SerializableUnaryOp,它扩展了 UnaryOperatorSerializable,并将其用作目标类型。
【解决方案2】:
import java.io.Serializable;

public class ProgramStack<T> implements Serializable {

// etc etc

}

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 2015-08-07
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多