当我尝试从数据库(mysql)中检索blob数据时,我得到了以下异常。
java.io.InvalidClassException:
com.nmsworks.cygnet.tmf.mtnm.elements.SNCUserData; local class
incompatible: stream classdesc serialVersionUID = -7634696886161105104,
local class serialVersionUID = -7522169448179471613
我相信在数据存储在数据库中之后,SNCUserData
类中发生了一些更改。我没有在类中声明默认的串行版本UID。我可以看到导致问题的原因。如果我声明了UID,我就不会收到此异常。我的问题是,不是将对象存储为数据库中的blob,是否有任何其他方法来保存对象,以便每当我从数据库存储和检索它时,我不必序列化和反序列化对象?我不想在类中声明一个串行版本UID,因为它是一个重型结构,反过来,它有很多可序列化的对象,我必须在其中声明UID。
答案 0 :(得分:0)
我相信在数据存储在数据库中之后,SNCUserData类中发生了一些变化。我没有在类中声明默认的串行版本UID。我可以看到导致问题的原因。
这足以导致问题。
如果我宣布了UID,我就不会收到此例外。
这是正确的。但是你可能有不同的例外;例如如果您已添加,删除,重新排序或更改了任何字段的类型。
我的问题是,不是将对象存储为数据库中的blob,还有其他方法来保存对象,这样每当我从数据库存储和检索它时,我都不必序列化和反序列化对象吗?
另一种方法是使用列创建一个或多个新表来表示对象的字段。然后编写一些Java代码来映射对象和表行。
好吧,是的。但这是你最不担心的事情。如果您确实开始声明串行UID,那么如果您更改类的结构,那么您可能需要编写自定义我不想在类中声明一个串行版本UID,因为它是一个重型结构,反过来,它有很多可序列化的对象,我必须在其中声明UID。
readObject
和writeObject
方法来处理此问题。
对于它的价值,将序列化对象放入数据库通常是一个坏主意。持久化复杂对象的“现代”方法是使用对象关系映射,例如JPA(例如Hibernate)或JDO。但即便如此,如果你对你坚持的课程进行彻底的改变,你也会遇到问题。