Java Serializable 和 lambda 表达式

标签 java lambda serializable notserializableexception

我需要将一个对象保存在文件中,然后稍后检索它。对象本身实现了接口(interface) 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;
}
}

最佳答案

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

transient protected Function<SerField, String> lambda;

关于Java Serializable 和 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64417151/

相关文章:

java - 即使执行成功后控制也没有返回提示的可能原因是什么?

java - 自定义 Gradle 任务类使用哪种语言?

lambda - Scheme 中 lambda 表达式的求值顺序

java gui - 保存和加载数据

android - 通过适配器在 fragment 之间传递数据 (Kotlin Android)

java - 如何在HashMap中保持插入顺序?

java - 如何使用请求 getAttribute java 获取 boolean 值?

matlab:列上的映射函数(如 lisp)

c# - 你如何捕获迭代变量?

java - 是否有内置方法来检测序列化的 java 对象是否缺少字段?