Java 可序列化和 lambda 表达式

Posted

技术标签:

【中文标题】Java 可序列化和 lambda 表达式【英文标题】:Java Serializable and lambda expressions 【发布时间】:2021-02-01 15:04:38 【问题描述】:

我需要将一个对象保存在文件中,然后再检索它。该对象本身实现了接口Serializable,但其中一个字段包含lambda 表达式。显然这算作一个没有实现Serializable 接口的字段,我得到一个java.io.NotSerializableException

我不想彻底改变我的代码,但我不知道在这种情况下该怎么做。有人有建议吗?

下面是复制此问题的示例代码:

public class SerObject implements Serializable 

/**
 * 
 */
private static final long serialVersionUID = -2691834780794406081L;

public SerField field;

public SerObject(SerField field) 
    this.field = field;


public String stringRepresentation() 
    return this.field.name() + "\t" + field.lambda.apply(field);


static final String pathname = "D:\\JavaData\\file.obj";

public static void main(String[] args) 
    SerObject obj = new SerObject(new SerField("Field", (field) -> "Class is " + field.getClass().getName()  ));
    
    SerializableUtilities.saveObject(new File(pathname), obj);
    
    SerObject loadedObj = SerializableUtilities.loadObject(new File(pathname));
    System.out.println(loadedObj.stringRepresentation());



public class SerField implements Serializable 

/**
 * 
 */
private static final long serialVersionUID = -5058433150929459799L;

protected String name;

protected Function<SerField, String> lambda;

public SerField(String name, Function<SerField, String> lambda) 
    this.name = name;
    this.lambda = lambda;


public abstract String name() 
    return this.name;

【问题讨论】:

this.lambda = (Function&lt;SerField, String&gt; &amp; Serializable)lambda; 应该可以工作。可以试试吗? 【参考方案1】:

你不能持久化一个函数——它不代表数据,它代表行为。 使用transient 关键字来防止其在文件中持久存在。

transient protected Function<SerField, String> lambda;

【讨论】:

抱歉,打错了。我的意思是“行为”。状态确实是数据。 @Monis 我也需要保存该行为。 lamba 表达式用作单个特定方法的指令:如果我要使方法抽象并在对象初始化时指定抽象方法必须做什么,我是否能够使用 Serializable 接口保存和加载对象?

以上是关于Java 可序列化和 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

Java 高级特性: Lambda 表达式

Java中普通lambda表达式和方法引用本质上有啥区别

Java -- Lambda表达式;函数式接口

java拓展----探秘Lambda 表达式

Java8特性Lambda表达式

Java 8 Lambda 表达式