Java - InvalidClassException 本地类不兼容的serialVersionUID
Posted
技术标签:
【中文标题】Java - InvalidClassException 本地类不兼容的serialVersionUID【英文标题】:Java - InvalidClassException local class incompatible serialVersionUID 【发布时间】:2015-02-07 03:04:55 【问题描述】:我创建了一个客户端应用程序,它从数据库 (Oracle) 中获取一些数据并将它们序列化。对于一些数据(每 100 次发生一次),当序列化数据时,会失败并出现以下异常:
Exception in thread "main" java.io.InvalidClassException: org.jdom.Element; local class incompatible: stream classdesc serialVersionUID = -5756298698047880134, local class serialVersionUID = -1584223699423688446
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621) at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:621)
数据与其他应用程序一起插入到数据库中。
看看谷歌,我发现也许应该定义一个serialVersionUID。我这样做了(我不完全确定它是正确的)但没有解决。我的代码:
public class Test1
/(private static final long serialVersionUID = -5756298698047880134L;//-1584223699423688446L
public static void main(String[] args) throws Exception
// TODO code application logic here
ExecutionContext ret = null;
System.out.println("Connection with BD...");
String url = "url";
String user = "user";
String password = "password";
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("Connection ok...");
System.out.println("Create Query...");
String query = "SELECT ... FROM ...";
Statement st = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = st.executeQuery(query);
if (rs.next())
Blob blob = rs.getBlob("EXECUTION_CONTEXT");
if (blob == null)
System.out.println ("Blob null");
try
InputStream is = blob.getBinaryStream();
GZIPInputStream gzip = new GZIPInputStream(is);
ObjectInputStream os = new ObjectInputStream(gzip);
//Here is where fail:
ret = (ExecutionContext)os.readObject();
//
catch(ZipException ie)
if(ie.getMessage().equals("Not in GZIP format"))
System.out.println("Not in GZIP format");
InputStream is = blob.getBinaryStream();
ObjectInputStream os = new ObjectInputStream(is);
//Here is where fail:
ret = (ExecutionContext) os.readObject();
//
else
JOptionPane.showMessageDialog(null, "Error when extracting data");
有什么想法吗?
编辑解决方案:
在我选择序列化对象的ExecutionContext类中,在这个类中必须实现Serializable并定义serialVersionUID。
ret = (ExecutionContext) os.readObject();
【问题讨论】:
【参考方案1】:serialVersionUID
需要定义为与流中相同的值:-5756298698047880134
。
您必须部署了两个不同版本的 JDOM 库。
【讨论】:
我在我的类中定义了serialVersionUID(我把它放在代码上面)但没有解决。我应该将我的 serialVersionUID 传递给 readObject 方法吗?怎么样? 那么您没有部署更改和重新编译的代码。再试一次。你不需要做更多的事情。您可以通过为local class serialVersionUID
打印的值来判断实际值是多少。
我做了一个“清除和构建”,运行应用程序时我有同样的异常。如果我打印 serialVersionUID,则显示我在 Test1 类中指定的值(实现 Serializable),但错误是相同的......在上面的代码中,您可以看到我如何指定 serialversionUID。
好的,我看到了问题。在 ExecutionContext 类中,我必须定义 serialVersionUID。谢谢你。
根据错误信息是org.jdom.Element
类。以上是关于Java - InvalidClassException 本地类不兼容的serialVersionUID的主要内容,如果未能解决你的问题,请参考以下文章