带有“private static final long”的SerialVersionUID仍会获得InvalidClassException

时间:2010-04-27 20:48:56

标签: java serialization

我已经在我的Java应用程序中编译和破坏了各种项目,通过Eclipse自动生成serialVersionUIDs,用于从Serializable派生的所有类。

我阅读了这个question的答案,并验证了serialVersionUids都是private static final long

然而,当我尝试运行时,我收到这样的错误:

java.io.InvalidClassException:com.acme.product.Widget;当地班级 不兼容:stream classdesc serialVersionUID = 5226096973188250357,local class serialVersionUID = -5432967318654384362

我错过了什么?

3 个答案:

答案 0 :(得分:1)

您可能遇到类路径问题,您的程序正在解析该类的较旧的不兼容版本,该版本具有不同的serialVersionUID值。

或者正在加载的序列化对象是使用现在不可用的类的oder版本序列化的。

答案 1 :(得分:1)

如果类序列化后类已更改,则更改可能不兼容。即使使用包含的serialVersionUID,序列化也无法对其进行反序列化。

如果您具有序列化时的类(例如来自SCM),则尝试恢复为该类,重新生成serialVersionUID并重新运行。

如果您进行了不兼容的更改,则必须实现readObject()/ writeObject()以自行处理序列化详细信息。

答案 2 :(得分:-1)

  

stream classdesc serialVersionUID =   5226096973188250357

     

我错过了什么?

您缺少的是私有静态最终长版serialVersionUID = 5226096973188250357L;

但是,如果更改的类不再与序列化兼容(请参阅对象序列化规范),您现在可能会遇到更加模糊的错误。