我正在和朋友一起使用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");

最佳答案

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

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

从文档:


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

关于java - 尝试反序列化对象时发生错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60706519/

10-10 01:06