当前位置: 首页 > 知识库问答 >
问题:

lambda的序列化[重复]

沈实
2023-03-14

我在搞lambdas的Java序列化。

我有两个完全独立的项目,其中只有一个类。

项目1:

class TestMain {

    public static void main(String[] args) {
        Runnable r = (Runnable & Serializable) () -> {};

        // Serialize r to C:/file.ser;
    }
}

项目二:

class TestMain2 {

    public static void main(String[] args) {
        // Deserialize C:/file.ser to runnable;
    }
}

但是,在尝试反序列化可运行文件时,它会抛出一个异常,说它找不到TestMain

...我有什么办法可以避免这种情况吗?

共有2个答案

邓阳炎
2023-03-14
...is there any way I can avoid this?

广义地说,没有。

序列化是一种持久化数据的方法,而不是代码。序列化类的代码需要在反序列化时存在于执行反序列化的JVM中。

听起来像是在两个JVM之间传递代码
有一些技术可以做到这一点,但不是通过序列化。

邹玮
2023-03-14

解决方案是在反序列化时在类路径上包含TestMain。

lambda隐式地依赖于声明它的外部类。

此外,Java教程说:

然而,与内部类一样,强烈反对lambda表达式的序列化。

此外正如@Tim所指出的。。。即使您不需要TestMain。类,您仍然需要TestMain$xxx。类包含lambda代码的文件。

 类似资料:
  • Eclipse JDT编译器似乎有一个问题,在某些情况下,Java8个lamda没有正确反序列化,而是抛出一个。我正在使用最近的分布式维护版本,如下所示: 现有的bug/SO条目报告了在中已经(至少部分)解决的类似问题。我亲自验证了以下问题已经得到解决。 无法反序列化访问实例字段和方法的Java 8 lambda https://bugs.eclipse.org/bugs/show_bug.cgi

  • 我可以使用以下语法序列化lambda: 然而,如果我从客户机代码接收到lambda,并且它没有被适当地强制转换,我就无法序列化它。 如何在不更改其定义的情况下序列化下面的: 我尝试序列化一个“派生”对象: 但是在每种情况下,都失败,。

  • 问题内容: 作为一个小项目,我一直在尝试做一个小事,它可以读取序列化的lambda(从本地或从FTP)并调用它们的运行函数作为测试的一部分,以测试Windows中的文件关联(即打开某些文件类型)使用特定程序打开它们),但不管如何,无论如何,它似乎从未正确地反序列化。 lambda被这样声明 并使用由ObjectOutputStream包装的[n可选] BufferedOutputStream包装的

  • 问题内容: 如何优雅地序列化lambda? 例如,下面的代码抛出。如何在不创建“虚拟”界面的情况下进行修复? 问题答案: Java 8引入了通过添加多个边界将对象转换为类型的交集的可能性。因此,在序列化的情况下,可以编写: 并且lambda自动变为可序列化的。

  • 作为一个小项目,我一直在尝试制作一个小东西来读取序列化的lambda(本地或从FTP)并调用它们的run函数,作为测试的一部分,以在Windows中试验文件关联(即打开某些文件类型会用某个程序打开它们)等等,但无论我尝试什么,它似乎都无法正确地反序列化。 lambda是这样宣布的 并使用由ObjectOutputStream包装的[n可选]BufferedOutputStream包装的FileOu

  • 有没有人成功地为 S3 事件实施了基于 Java 的请求处理程序? 我的班级: 错误消息: JSON 解析期间发生错误:java.lang.RuntimeException java.lang.RuntimeException:JSON 解析期间发生错误 由以下原因引起:java.io.UncheckedIOException: com.fasterxml.jackson.databind.Jso