因此,我一直在思考Tyrus项目所需的增强功能,该功能允许用户广播到跨机器集群连接到URL的客户端子集。 有多种方法可以做到这一点; 但是自从我使用JDK 8以来,这个问题肯定看起来像钉子。

为此,我创建了一个简单的单元测试类,该类将使用我的过滤器,将其序列化到磁盘,读回它,然后执行它。 它有一个实例字段“ VALUE”,我们可以使用它直接或间接引用以找出导致序列化失败的原因。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.NotSerializableException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;import java.util.function.Predicate;import org.junit.Test;public class SerializablePredicateFilterTest {public String VALUE = "Bob";public interface SerializablePredicate<T> extends Predicate<T>, Serializable {}public <T> void filter(SerializablePredicate<T> sp, T value) throws IOException, ClassNotFoundException {sp.getClass().isLocalClass();File tempFile = File.createTempFile("labmda", "set");try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(tempFile))) {oo.writeObject(sp);}try (ObjectInput oi = new ObjectInputStream(new FileInputStream(tempFile))) {SerializablePredicate<T> p = (SerializablePredicate<T>) oi.readObject();System.out.println(p.test(value));}}}

因此,为了进行校准,请确保匿名内部类将失败,因为它始终包含对封闭对象的引用……。

@Test(expected = NotSerializableException.class)public void testAnonymousDirect() throws IOException, ClassNotFoundException {String value = VALUE;filter(new SerializablePredicate<String>() {@Overridepublic boolean test(String t) {return value.length() > t.length();}}, "Bob");}

本地类也是如此,您不使用本地类吗?

@Test(expected = NotSerializableException.class)public void testLocalClass() throws IOException, ClassNotFoundException {class LocalPredicate implements SerializablePredicate<String> {@Overridepublic boolean test(String t) {// TODO Implement this methodreturn false;}}filter(new LocalPredicate(), "Bobby");}

因此,当然可以使用独立的类,在这种情况下,为方便起见,可以使用嵌套类。

public static class LengthPredicate implements SerializablePredicate<String> {private String value;public LengthPredicate(String value) {super();this.value = value;}public void setValue(String value) {this.value = value;}public String getValue() {return value;}@Overridepublic boolean test(String t) {// TODO Implement this methodreturn false;}}@Testpublic void testStaticInnerClass() throws IOException, ClassNotFoundException {filter(new LengthPredicate(VALUE), "Bobby");}

因此,让我们开始使用JDK 8,事实证明,我的第一次尝试也失败了,但它确实确认序列化对于使用Lambda非常满意。

@Test(expected = NotSerializableException.class)public void testLambdaDirect() throws IOException, ClassNotFoundException {filter((String s) -> VALUE.length() > s.length(), "Bobby");}

稍作修改即可将值复制到有效的最终属性中,现在可以对lambda进行序列化并正确检索。

@Testpublic void testLambdaInDirect() throws IOException, ClassNotFoundException {String value = VALUE;filter((String s) -> value.length() > s.length(), "Bobby");}

当然,如果该值是一个简单的方法参数,它也可以正常工作。

@Testpublic void testLambdaParameter() throws IOException, ClassNotFoundException {invokeWithParameter(VALUE);}private void invokeWithParameter(String value) throws java.lang.ClassNotFoundException, java.io.IOException {filter((String s) -> value.length() > s.length(), "Bobby");}

因此答案是肯定的,如果您稍加注意,就可以将其序列化。

参考: Lambda,会序列化吗? 来自我们的JCG合作伙伴 Gerard Davison,来自Gerard Davison的博客博客。

翻译自: https://www.javacodegeeks.com/2013/12/lambda-will-it-serialize.html

Lambda,会序列化吗?相关推荐

  1. lambda 序列化_如何以及为什么要序列化Lambda

    lambda 序列化 总览 lambda序列化在许多用例中很有用,例如持久配置或作为远程资源的访客模式 . 远程访客 例如,因此我想访问远程Map上的资源,可以使用get / put,但是说我只想从M ...

  2. lambda 序列化_Lambda,会序列化吗?

    lambda 序列化 因此,我一直在思考Tyrus项目所需的增强功能,该功能允许用户广播到跨机器集群连接到URL的客户端子集. 有多种方法可以做到这一点. 但是自从我使用JDK 8以来,这个问题肯定看 ...

  3. 如何以及为什么序列化Lambda

    总览 lambda序列化在许多用例中很有用,例如持久配置或作为远程资源的访客模式 . 远程访客 例如,因此我想访问远程Map上的资源,可以使用get / put,但是说我只想从Map的值中返回一个字段 ...

  4. lambda层保存模型出错_保存您的lambda,以备不时之需-保存到文件

    lambda层保存模型出错 介绍 简短的帖子,描述了如何将Java lambda持久化到文件中以在不同的过程中重复使用. 序列化Lambda Java 8中引入的Lambda使函数成为Java语言的一 ...

  5. 保存您的lambda,以备不时之需-保存到文件

    介绍 简短的帖子,描述了如何将Java lambda持久保存到文件中以在不同的过程中重复使用. 序列化Lambda Java 8中引入的Lambda使函数成为Java语言的一等公民(几乎). 它们消除 ...

  6. 几种Java常用序列化框架的选型与对比

    简介: 序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术,但是目前各种序列化框架让人眼花缭乱,不清楚什么场景到底采用哪种序列化框架.本文会将业界开源的序列化框架进行对比测试,分别从通用性 ...

  7. Spark 2.4重磅发布:优化深度学习框架集成,提供更灵活的流式接收器

    Apache Spark 2.4.0是2.x系列中的第五个版本.此版本增加了屏障执行模式,以便更好地与深度学习框架集成:引入30多个更高阶的内置函数,能够更轻松地处理复杂数据类型:优化K8s集成,同时 ...

  8. 关于Java你不知道的10件事

    转载自 关于Java你不知道的10件事 作为 Java 书呆子,比起实用技能,我们会对介绍 Java 和 JVM 的概念细节更感兴趣.因此我想推荐 Lukas Eder 在 jooq.org 发表的原 ...

  9. java多线程做一件事_关于Java的十件事

    java多线程做一件事 那么,您从一开始就一直在使用Java? 还记得那些被称为" Oak"的日子,OO仍然是热门话题,C ++人士认为Java没有机会,Applet还是一件事吗? ...

最新文章

  1. 在SQL Server中调用.NET程序集
  2. 实战 用户登录、session校验、分布式存储session
  3. 7.16 T1 礼物
  4. 014_logback中的SiftingAppender
  5. 【项目管理】ITTO-成本管理
  6. jenkins 指定 之前某版本 构建
  7. Rinne Loves Xor
  8. 计算图片相似度的方法
  9. Spring高级之注解@PropertySource详解(超详细)
  10. 详述 ISC BIND 服务器中的信息泄露漏洞
  11. 697小说源码PC端+手机端+采集工具(源码带3000本小说的数据)
  12. 射频电路学习之Smith圆图
  13. matlab最小二乘法拟合原理,最小二乘法曲线拟合_原理及matlab实现
  14. 常见笔顺错误的字_有哪些常见笔顺错误?
  15. (附源码)ssm人力资源管理系统 毕业设计 271621
  16. Openbravo怎么给工具栏添加一个按钮
  17. 如何在51单片机实现日程提醒(生日闹钟)
  18. python3 pdf下载无加密_如何实现使用python将pdf文档加密?
  19. 上海法官招嫖爆料者讲述始末
  20. PHP 8.1.0-dev后门复现

热门文章

  1. Spring [CVE-2022-22965]漏洞处理
  2. vaadin_Vaadin提示:延迟加载和商品标识
  3. java客户端api文档_Java 11:新的HTTP客户端API
  4. java掌握_掌握Java 11的Constantdynamic
  5. cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?
  6. python antlr_使用ANTLR在5分钟内用Java解析任何语言:例如Python
  7. java流式传输对象_使用Java 8在地图上流式传输
  8. javafx 剪切板_JavaFX技巧18:路径剪切
  9. if else 工厂模式_没有IF-ELSE的工厂
  10. 使用Java和JSF构建一个简单的CRUD应用