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

lambda创建后的序列化

饶明亮
2023-03-14

我可以使用以下语法序列化lambda:

Runnable r = (Runnable & Serializable) () -> System.out.println("");
try (ObjectOutput oo = new ObjectOutputStream(new ByteArrayOutputStream())) {
  oo.writeObject(r);
}

然而,如果我从客户机代码接收到lambda,并且它没有被适当地强制转换,我就无法序列化它。

如何在不更改其定义的情况下序列化下面的r

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

我尝试序列化一个“派生”对象:

Runnable r1 = (Runnable & Serializable) r::run;
Runnable r2 = (Runnable & Serializable) () -> r.run();

但是在每种情况下,oo.writeObject(rxxx);都失败,NotSerializableException

共有1个答案

姬经义
2023-03-14

这是正确的,而且是故意的。正如您不能接受不可序列化的对象并在实例化后使其可序列化一样,一旦创建了lambda,它的可序列化性也就设置好了。

如果lambda的目标类型是可序列化的(并且它捕获的参数是可序列化的。)您的第一个示例是可序列化的,因为目标类型是交集(Runnable

 类似资料:
  • 问题内容: 我可以使用以下语法序列化lambda: 但是,如果我从客户端代码接收到lambda,并且未正确进行转换,则无法序列化它。 如何在不更改其定义的情况下在下面进行序列化: 我试图序列化“派生”对象: 但在每种情况下均以失败。 问题答案: 这是正确的,并且是设计使然。就像无法获取不可序列化的对象并使其在实例化之后可序列化一样,一旦创建了lambda,则将设置其可序列化性。 如果lambda的

  • 我在搞lambdas的Java序列化。 我有两个完全独立的项目,其中只有一个类。 项目1: 项目二: 但是,在尝试反序列化可运行文件时,它会抛出一个异常,说它找不到 ...我有什么办法可以避免这种情况吗?

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

  • 我为函数分配了128MB内存,这真的不足以简单地获取凭据并实例化AmazonS3Client对象吗? 我尝试给AmazonS3Client构造函数 以及 编辑1如果我将分配给函数的内存增加到192MB,它就可以正常工作,尽管奇怪的是,报告在cloudwatch日志中只使用59MB内存。我只是失去了剩下的记忆吗?

  • 我正在尝试创建hadoop序列文件。 我成功地在HDFS中创建了一个序列文件,但是如果我试图读取一个序列文件,就会出现“sequence file not a SequenceFile”错误。我还检查一个在HDFS中创建的序列文件。 这里是我的源代码,可以读写序列文件到HDFS。 2018-09-17 17:15:34,267 WARN[main]util.nativeCodeLoader(nat

  • 我是Java新手,我正在尝试使用Lambda表达式和比较器。我有一个具有其他getter和toString方法的公共类人员: 现在我想对一个Person[]列表进行排序,首先按String(降序)进行比较,然后按年龄(升序)进行比较,然后按计算机数量(降序)进行比较,最后按Salary(升序)进行比较。我无法实现可比较,因为如果我重写compareTo方法,它应该是升序或降序,我需要两者。我想知道