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