Java 尝试反序列化对象时出错
我正在和朋友一起使用GitHub进行编码,当我们更新主类时,IDE向我们提供了以下错误:Java 尝试反序列化对象时出错,java,file,deserialization,Java,File,Deserialization,我正在和朋友一起使用GitHub进行编码,当我们更新主类时,IDE向我们提供了以下错误: Exception in thread "main" java.io.InvalidClassException: Packages.contoCorrente; local class incompatible: stream classdesc serialVersionUID = -433050874178120905, local class serialVersionUID = -52139991
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");
publicstaticvoidmain(字符串[]args)引发异常{
ArrayList contiCorrentiArray;
文件文件=新文件(“contiCorrenti”);
if(file.exists()){
FileInputStream fileIn=新的FileInputStream(文件);
ObjectInputStream fileObjIn=新的ObjectInputStream(fileIn);
//未检查
contiCorrentiArray=(ArrayList)fileObjIn.readObject();
fileObjIn.close();
fileIn.close();
}否则{
contiCorrentiArray=newarraylist();
}
System.out.println(“Numero Conti Presenti:+contiCorrentiArray.size()+”\n”);
您和您的合作伙伴是否具有相同的SerialVersionID
如果不是,你们都应该定义它,这样它就不会自动计算
从文档中:
如果可序列化类未显式声明
serialVersionUID,则序列化运行时将计算
基于各个方面的该类的默认SerialVersionId值
类的,如Java(TM)对象序列化中所述
但是,强烈建议所有
可序列化类显式声明serialVersionUID值,因为
默认的serialVersionUID计算对类高度敏感
详细信息可能因编译器实现而异,可以
因此,在运行期间会导致意外的InvalidClassException
因此,为了保证一致的serialVersionUID
跨不同java编译器实现的值,可序列化
类必须声明显式的serialVersionUID值。它也是
强烈建议显式serialVersionUID声明使用
私有修饰符,因为此类声明仅适用于
立即声明的类--SerialVersionId字段不可用
用作继承成员。数组类不能声明显式
serialVersionUID,因此它们始终具有默认的计算值,但
对于以下情况,不需要匹配serialVersionUID值
数组类`
我们在哪里可以定义它呢?因为我们最近正在使用序列化,我们不知道如何移动…在类
conteCorrente
中添加一行,比如private static final long serialVersionUID=-166202230670224623L;
。正如Turo所说的。添加类contoCorrente
。顺便说一下,为了遵循命名约定,它是应该是ContoCorrente