1

我想序列化和反序列化一个包含颜色数组的对象。(颜色[][])

颜色数组代表一个小图标。

经过一些构建后,当我尝试反序列化对象时出现错误:

java.io.InvalidClassException: java.awt.Color; local class incompatible: stream classdesc serialVersionUID = 118526816875918197, local class serialVersionUID = 118526816881161077

我能做些什么来解决这个问题?对象本身具有默认 UID (serialVersionUID = 1L;)...

谢谢 :)

4

1 回答 1

2

再次查看错误消息:

java.io.InvalidClassException: java.awt.Color; 
local class incompatible: 
stream classdesc serialVersionUID = 118526816875918197, 
local class serialVersionUID = 118526816881161077

似乎您使用一个版本对类进行了序列化,Color并尝试使用其他版本对其进行反序列化。

这是serialVersionUID在我的环境中。

 private static final long serialVersionUID = 118526816881161077L;

它与您的第二个serialVersionUID. 但是第一个是不同的:118526816875918197. 这个事实有点奇怪,因为我将这个版本 ID 与 java 6 和 java 7 JDK 进行了比较,它们是相等的。我无法将它与较旧的 JDK 以及其他供应商(不是 Oracle)的 JDK 进行比较。所以我可以假设您使用旧版本的 JDK 或其他供应商的 JDK(例如 open JDK、IBM 等)或其他平台创建了文件。

如果是这种情况,我建议您通过实现自己的writeObject()readObject()方法来自定义类的序列化。您不必重新实现所有类的序列化。Color用您的自定义包装器为它定制序列化就足够了。

顺便说一句,序列化对象的向前/向后兼容性是 java 整个序列化机制的一个众所周知的弱点。您可以使用替代方法,例如序列化为 JSON、XML 或其他二进制格式。

对于 JSON,您可以使用 Jackson 或 Gson,对于 XML JAXB 或 Xstream,对于二进制格式 protobuff。

于 2013-10-14T13:41:03.907 回答