从数据库反序列化blob字段时出现InvalidClassException

时间:2014-07-27 06:23:08

标签: java mysql serialization blob

当我尝试从数据库(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。

1 个答案:

答案 0 :(得分:0)

  

我相信在数据存储在数据库中之后,SNCUserData类中发生了一些变化。我没有在类中声明默认的串行版本UID。我可以看到导致问题的原因。

这足以导致问题。

  

如果我宣布了UID,我就不会收到此例外。

这是正确的。但是你可能有不同的例外;例如如果您已添加,删除,重新排序或更改了任何字段的类型。

  

我的问题是,不是将对象存储为数据库中的blob,还有其他方法来保存对象,这样每当我从数据库存储和检索它时,我都不必序列化和反序列化对象吗?

另一种方法是使用列创建一个或多个新表来表示对象的字段。然后编写一些Java代码来映射对象和表行。

  

我不想在类中声明一个串行版本UID,因为它是一个重型结构,反过来,它有很多可序列化的对象,我必须在其中声明UID。

好吧,是的。但这是你最不担心的事情。如果您确实开始声明串行UID,那么如果您更改类的结构,那么您可能需要编写自定义readObjectwriteObject方法来处理此问题。

对于它的价值,将序列化对象放入数据库通常是一个坏主意。持久化复杂对象的“现代”方法是使用对象关系映射,例如JPA(例如Hibernate)或JDO。但即便如此,如果你对你坚持的课程进行彻底的改变,你也会遇到问题。

相关问题