【发布时间】:2015-03-09 16:10:56
【问题描述】:
我有一个带有 lambda 表达式的检票口项目。在用户单击后退按钮的一页上,我的应用程序崩溃:
java.lang.IllegalArgumentException: Invalid lambda deserialization
at x.y.z.MyPage$3.$deserializeLambda$(MyPage.java:1)
在页面类(我返回的地方)中,我使用 lambda 表达式来实现这个接口:
public interface Localizator extends Serializable {
String getLocalizedString(String key);
}
还有 lambda:
protected void someMethod() {
localize((String key) -> getString(key));
}
当我将 lambda 更改为匿名类时,一切正常。在这种情况下我应该如何使用 lambda?
环境:Java 1.8.0_25、Netbeans 8.0.2、Wicket 6.17.0。
编辑: 这是使用 lambda 的真实(但简化)方法:
@Override
protected DataLoader createDataLoader() {
return new DataLoader(){
@Override
public List loadData() {
...
}
@Override
public List convertToTableRows(List data) {
return Converter.asRowList(
data,
(Record record) -> {...}, // this lambda is OK
(String key) -> getString(key)); // this lambda is crashing
}
@Override
public List filterTableRow() {
...
}
};
}
转换器类:
public class Converter implements Serializable {
public static ArrayList asRowList(List data, OtherLoader loader, Localizator localizator){...}
DataLoader 还扩展了 Serializable。
【问题讨论】:
-
您的
localize()方法看起来如何? -
其实localize方法只是一个例子,lambda用在更复杂的上下文中,我会编辑我的问题来展示它在现实中是如何使用的。
-
是的,以这种方式转换 lambda (Localizator & Serializable)(String key) -> getString(key) 有帮助,但我不明白为什么我必须将可序列化接口的 lambda 转换为可序列化。我是否必须在每个页面中将每个 lambda 转换为可序列化?这毫无意义……
-
当函数
interface扩展Serializable时,不需要额外的演员表。确保类是同步的,例如您没有针对尚未扩展Serializable的interface版本编译MyPage.java,并且您没有尝试使用MyPage类的不同版本进行反序列化。