访问实例字段和方法的Java 8 Lambda不能反序列化

在我看来,这是编译器或JVM中的错误,但也许有人有更好的解释。

以下代码按原样运行正常,但是如果我取消注释第二个runnable初始化(直接使用“

this”),则无法对对象进行反序列化(in.readObject()引发异常)。

public class TestClass implements Serializable {

String msg = "HEY!";

SerializableRunnable runnable;

public TestClass() {

TestClass self = this;

runnable = () -> self.say(); // uses a local copy of 'this'

// runnable = () -> this.say(); // uses 'this' directly

}

public void say() {

System.out.println(msg);

}

public static void main(String[] args) throws Exception {

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

try (ObjectOutputStream out = new ObjectOutputStream(buffer)) {

out.writeObject(new TestClass());

}

try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray()))) {

TestClass s = (TestClass) in.readObject();

s.say();

}

}

}

interface SerializableRunnable extends Runnable, Serializable {

}

这是根本原因的堆栈跟踪:

java.lang.IllegalArgumentException: Invalid lambda deserialization

at j8test.TestClass.$deserializeLambda$(TestClass.java:1)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.lang.invoke.SerializedLambda.readResolve(SerializedLambda.java:230)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:483)

at java.io.ObjectStreamClass.invokeReadResolve(ObjectStreamClass.java:1104)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1810)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1993)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1918)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1801)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

at j8test.TestClass.main(TestClass.java:30)

这是预期的行为吗?

回答:

我尝试了所有尝试,但最显而易见的尝试。

该问题发生在Eclipse中(其中Java 8支持仍处于beta中),而在javac中则没有。因此,这是一个JDT错误。

我在跑:

Eclipse IDE for Java and Report Developers

Version: Luna RC1 Release (4.4.0RC1)

Build id: 20140522-1310

Java(TM) SE Runtime Environment (build 1.8.0_05-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

OS X 10.9.3

也许它已在最近的版本中得到纠正。

以上是 访问实例字段和方法的Java 8 Lambda不能反序列化 的全部内容, 来源链接: utcz.com/qa/405226.html

回到顶部