在我看来,这是编译器或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
也许它已在最近的版本中得到纠正。
在我看来,这是编译器或JVM中的一个bug,但也许有人有更好的解释。 下面的代码运行正常,但如果我取消注释直接使用“this”的第二个可运行初始化,它将无法反序列化对象(引发异常)。 这是根本原因的堆栈跟踪: 是预期的行为吗?
无法反序列化java实例。lang.String[]值外\u字符串标记[…](通过参考链:[……])。模型用户[“种族”]) 我有一个用户对象的属性。 从这里我可以看出,错误是因为json“type”与属性类型不匹配,但在我的例子中,两者都是字符串数组。 我做错什么了吗? 此外,我无法理解在解析中代表什么。 服务器端正在使用环回,并且ethnicities属性的定义如下: Android客户端使用
我用的是Kotlin,Spring Boot,Jackson数据格式csv。不确定如何将csv的响应作为域对象列表返回。我有以下错误:无法反序列化超出起始\u数组令牌 我的代码如下:
我有一个Spring启动应用程序,我有一个BlogsService调用一个博客库,它应该返回一个与所传递的搜索查询相匹配的博客列表。我得到了以下由第76行引起的结果。有什么想法吗?谢谢 第76行: IllegalArgument异常:不能反序列化的的实例START_ARRAY令牌在[Source: UNKNOWN;行:-1,列:-1]在com.cor.devsquareawsservice.ser
问题内容: 我有一个类,该类具有一个命名的字段(它与我的类具有相同的类型并具有修饰符): 在该类中,我定义了一个名为的方法,该方法具有一个类型为type的参数。我想知道为什么我可以直接访问实例字段?我的意思是该字段是,不是通过实例受害者无法访问的吗? 问题答案: 隐私不是针对每个实例的,而是针对每个班级的。 该类可以访问所有实例的私有字段。 例如,该方法可以将o(如果适用)转换为相同类型,并将其私
我的问题是为什么找不到“name”字段?