反序列化java.awt.Color - > java.io.InvalidClassException

时间:2013-10-14 13:22:46

标签: java serialization deserialization

我想序列化和反序列化包含颜色数组的Object。 (彩色[] [])

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

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

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

我该怎么做才能解决这个问题? Object本身具有默认UID(serialVersionUID = 1L;)...

谢谢:)

1 个答案:

答案 0 :(得分: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以及其他供应商的JDK(不是来自Oracle)进行比较。因此,我可以假设您使用较旧版本的JDK或其他供应商的JDK(例如,打开JDK,IBM等)或其他平台创建了您的文件。

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

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

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