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