尝试反序列化对象时发生错误

时间:2020-03-16 13:02:15

标签: java file deserialization

我正在和朋友一起使用GitHub进行编码,当我们更新主类时,IDE向我们提供以下错误:

Exception in thread "main" java.io.InvalidClassException: Packages.contoCorrente; local class incompatible: stream classdesc serialVersionUID = -433050874178120905, local class serialVersionUID = -5213999116280532749
at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1958)
at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1827)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2115)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at java.base/java.util.ArrayList.readObject(ArrayList.java:928)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1160)
at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2271)
at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at ObjectWrite.main(ObjectWrite.java:31)

要解决此问题,我总是删除主目标文件,以便可以对其进行重建。我还将附加有关反序列化的代码部分,以希望有人能帮助我。

public static void main(String[] args) throws Exception {

        ArrayList<contoCorrente> contiCorrentiArray;
        File file = new File("contiCorrenti");
        if (file.exists()) {
            FileInputStream fileIn = new FileInputStream(file);
            ObjectInputStream fileObjIn = new ObjectInputStream(fileIn);

            //noinspection unchecked
            contiCorrentiArray = (ArrayList<contoCorrente>) fileObjIn.readObject();


            fileObjIn.close();
            fileIn.close();
        } else {
            contiCorrentiArray = new ArrayList<>();
        }

    System.out.println("Numero Conti Presenti: " + contiCorrentiArray.size() + "\n");

1 个答案:

答案 0 :(得分:1)

您和您的合作伙伴是否具有相同的serialVersionUID?

如果没有,则都应该定义它,这样就不会自动计算出它。

从文档中:

如果可序列化的类未明确声明 serialVersionUID,则序列化运行时将计算 该类基于各个方面的默认serialVersionUID值 类的名称,如Java(TM)对象序列化中所述 规范。但是,强烈建议所有 可序列化的类显式声明了serialVersionUID值,因为 默认的serialVersionUID计算对类高度敏感 细节可能会根据编译器的实现而有所不同,并且可以 从而导致在发生意外的InvalidClassExceptions 反序列化。因此,要保证serialVersionUID一致 跨不同Java编译器实现的价值,可序列化 类必须声明一个显式的serialVersionUID值。也是 强烈建议显式serialVersionUID声明使用 私有修饰符,因为这样的声明仅适用于 立即声明的类--serialVersionUID字段不是 作为继承成员很有用。数组类无法声明显式 serialVersionUID,因此它们始终具有默认的计算值,但是 无需匹配serialVersionUID值的要求 数组类。 `

相关问题