我已经在我的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
我错过了什么?
答案 0 :(得分:1)
您可能遇到类路径问题,您的程序正在解析该类的较旧的不兼容版本,该版本具有不同的serialVersionUID值。
或者正在加载的序列化对象是使用现在不可用的类的oder版本序列化的。
答案 1 :(得分:1)
如果类序列化后类已更改,则更改可能不兼容。即使使用包含的serialVersionUID,序列化也无法对其进行反序列化。
如果您具有序列化时的类(例如来自SCM),则尝试恢复为该类,重新生成serialVersionUID并重新运行。
如果您进行了不兼容的更改,则必须实现readObject()/ writeObject()以自行处理序列化详细信息。
答案 2 :(得分:-1)
stream classdesc serialVersionUID = 5226096973188250357
我错过了什么?
您缺少的是私有静态最终长版serialVersionUID = 5226096973188250357L;
但是,如果更改的类不再与序列化兼容(请参阅对象序列化规范),您现在可能会遇到更加模糊的错误。