Java 休眠序列化失败
我有一个Java客户机-服务器应用程序,前端是Swing,后端是JBoss。它是在JBoss6.4和Hibernate4.2下运行的,现在它在更新到JBoss7.2和Hibernate5.3.7后失败了。当客户端试图序列化对象以将其发送回服务器时,我遇到了一个异常Java 休眠序列化失败,java,hibernate,jboss7.x,Java,Hibernate,Jboss7.x,我有一个Java客户机-服务器应用程序,前端是Swing,后端是JBoss。它是在JBoss6.4和Hibernate4.2下运行的,现在它在更新到JBoss7.2和Hibernate5.3.7后失败了。当客户端试图序列化对象以将其发送回服务器时,我遇到了一个异常 Caused by: java.io.StreamCorruptedException: serialVersionUID does not match! at org.jboss.marshalling.AbstractClassR
Caused by: java.io.StreamCorruptedException: serialVersionUID does not match!
at org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:108)
...
Caused by: an exception which occurred:
in field com.company.app.model.Vehicle.parts
in object com.company.app.model.Vehicle@75e4da10
in object of type com.company.app.model.Vehicle
错误似乎来自零件集合,该集合是未延迟加载的零件实体集合。Hibernate使用自己的SerialVersionUID创建代理对象,我了解到这可能会导致此错误
还要注意,即使零件集合为空,也会发生这种情况
在将车辆对象发送到客户端之前,我正在从会话中逐出车辆对象。我尝试在parts collection和Vehicle对象上调用Hibernate.unproxy,但没有任何区别。通过创建一个新列表,将零件添加到该列表中,然后用该新列表替换车辆对象中的零件列表,我终于能够让它工作了。这看起来像是一个黑客,但当有很多实体具有多个关系时,这是一个真正的痛苦
我阅读了一篇关于建议使用数据传输对象而不发送Hibernate实体对象本身的答案。但是,在以前版本的Hibernate下,这种方法工作得很好。我已经阅读了Hibernate 5.3文档和迁移指南,没有看到任何可能导致这种情况的更改
有什么想法吗?我应该试试看