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的主要内容,如果未能解决你的问题,请参考以下文章

Java 布尔运算

java [Java] Java常用代码#java

Java - 35 Java 实例

Java While 循环

Java 字符串

Java If ... Else