Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试反序列化对象时出错_Java_File_Deserialization - Fatal编程技术网

Java 尝试反序列化对象时出错

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

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