tomcate启动出现InvalidClassException

SEVERE: IOException while loading persisted sessions: java.io.InvalidClassException: com.ehi.sbg.core.rating.SGHealthPlanGroupRate; local class incompatible: stream classdesc serialVersionUID = -470877338133163279, local class serialVersionUID = 4717150679672597349
java.io.InvalidClassException: com.ehi.sbg.core.rating.SGHealthPlanGroupRate; local class incompatible: stream classdesc serialVersionUID = -470877338133163279, local class serialVersionUID = 4717150679672597349
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)

...

 


分析:


      当一个类实现了序列化接口,有时会遇到java.io.InvalidClassException异常出现,上面报的异常是序列化兼容性所致;java通过一个名为UID(stream unique identifier)来控制,这个UID是隐式的,它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的。也可以理解为,UID就是类的时间戳。如果UID不一样的话,就无法实现反序列化了,并且将会得到InvalidClassException。

为了避免版本问题带来的UID隐式的异常,可以通过显式的声名UID来
实现,对于上例,在SGHealthPlanGroupRate类中,添加:


private static final long serialVersionUID = 1L;

这样就解决了,注意UID不能有重复。建议,在需要序列化的类中添加serialVersionUID ,防止这类异常的抛出。

你可能感兴趣的:(java)