[英]Can not set java.lang.Integer field …User.id to java.lang.Integer exception in Hibernate
[英]Java Deserialization of java.lang.Integer - Exception
反序列化HashMap<String, Integer>
时收到以下异常:
java.io.InvalidClassException: java.lang.Integer; local class incompatible: stream classdesc serialVersionUID = 1360826667802527544, local class serialVersionUID = 1360826667806852920
在同一台机器上使用相同的 JRE 进行序列化和反序列化。 JDK 1.6.0_12
从 JDK 源代码来看, 1360826667806852920 是Integer
的正确serialVersionUID
。 我无法在 JDK 中使用serialVersionUID
1360826667802527544 找到任何类。
有趣的是,在 Google 上搜索 1360826667802527544 时发现了一些其他人遇到了这个问题,尤其是 Sun 论坛上的这个帖子。 那里的问题是这个人将字节存储在一个字符串中,并且序列化的数据被破坏了。 由于您获得了相同的serialVersionUID
,您似乎很可能遇到了类似的问题。
永远不要将字节存储在String
中。 使用字节数组或设计用于保存字节而不是字符的类。
我遇到了同样的问题,这是因为当我们尝试将 Integer 对象存储到 String 时,字符编码变得混乱,并且在反序列化时 serialVersionUID 读取是错误的。 这就是这个错误的根本原因。 为避免此错误,请在将其存储到 String 之前使用Base64编码。 看到这个答案,问题就为我解决了。
/** Read the object from Base64 string. */
private static Object fromString( String str ) throws IOException, ClassNotFoundException {
byte [] data = Base64.getDecoder().decode(str);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
Object o = ois.readObject();
ois.close();
return o;
}
/** Write the object to a Base64 string. */
private static String toString( Serializable o ) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream( baos );
oos.writeObject( o );
oos.close();
return Base64.getEncoder().encodeToString(baos.toByteArray());
}
检查 Integer 的源代码,这是我在几个 java 版本中对 Integer 的代码:
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1360826667806852920L;
所以我会说问题来自你的一类,你在序列化和反序列化之间进行了更改,并且没有特定的serialVersionUID ...
也许你应该看看这个,同样的问题描述,它看起来像错误的序列化/反序列化代码......
那不应该发生。 请注意,ID 仅在最后几位数字上有所不同; 第二个是我在我的 JDK 源代码中看到的那个。
我的猜测是序列化流以某种方式损坏了。
我在编译的 jasperreport 上遇到了同样的问题。 由于 ant build 的过滤,服务器上的 pack ear 已损坏。 结果,原始的jasperreport文件与耳朵上的那个有一些差异。
我已修改 ant 构建以仅复制文件(而不是过滤)而不过滤
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.