JavaRush /Java 博客 /Random-ZH /回应《Why use SerialVersionUID inside the Serialized class i...
Сергей
第 31 级
Киев

回应《Why use SerialVersionUID inside the Serialized class in Java》一文

已在 Random-ZH 群组中发布
所以..我们有一个类,我们想使用常规方法序列化(我们使用Serializable回应文章“Why use SerialVersionUID inside the Serialized class in Java” - 1
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    private String name;
    private int number;
 }
我们正在编写一个测试应用程序。我会立即说我的目标是展示什么serialVersionUID
package Serialization;

import java.io.*;

public class MainSerializable {
    final static String FILE_NAME = "c:\\File.dat";

    public static void serialize(Object object) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(FILE_NAME);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(object);

        fileOutputStream.close();
        objectOutputStream.close();
    }

    public static Object deserialize() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream(FILE_NAME);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Object object = objectInputStream.readObject();

        objectInputStream.close();

        return object;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        SerializableClass serializableClass = new SerializableClass();

        serialize(serializableClass);

        SerializableClass newObject = (SerializableClass) deserialize();
    }
}
一切都很好。该类被序列化到一个文件中FILE_NAME = "c:\\File.dat"。天快黑了...:) 忘记向类中添加字段。添加:
public class SerializableClass implements Serializable {
    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
 }
一切似乎都很好..一切都编译了..所以我们运行它,从文件“ ”main反序列化该类: SerializableClassc:\\File.dat
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass newObject = (SerializableClass) deserialize();
}
哎呀……怎么办呢……
Exception in thread "main" java.io.InvalidClassException: Serialization.SerializableClass; local class incompatible: stream classdesc serialVersionUID = 8129437039424566964, local class serialVersionUID = -8271479231760195917
	at java.base/java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:689)
	at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1903)
	at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)
	at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)
	at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)
	at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)
	at Serialization.MainSerializable.deserialize(MainSerializable.java:22)
	at Serialization.MainSerializable.main(MainSerializable.java:30)
总的来说,一切都是公平的。该类已更改,其 serialVersionUID= -8271479231760195917,并在文件serialVersionUID=中序列化8129437039424566964。现在该怎么办,该怎么办?如何创建实例?有一个出口。我们需要在我们的类中声明: static final long serialVersionUID,它等于serialVersionUID文件中灰显的:)类。那些。我们说,继续,我会反序列化.. 你可以.. 你的版本是相同的:
package Serialization;

import java.io.Serializable;

public class SerializableClass implements Serializable {
    static final long serialVersionUID = 8129437039424566964L;

    private String name;
    private int number;
    private String FirstName;   // +
    private String LastName;    // +
}
我们启动...并且...一切正常。据我了解,如果该类提前声明,则可以避免此错误:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    private String name;
    private int number;
}
那些。我们不让JavaserialVersionUID根据其算法(相当复杂的算法)进行自己的计算。现在,每当类发生变化时,我们serialVersionUID = 1L 都会检查:
public static void main(String[] args) throws IOException, ClassNotFoundException {
    SerializableClass serializableClass = new SerializableClass();

    serialize(serializableClass);

    SerializableClass newObject = (SerializableClass) deserialize();
}
它有效..现在像这样:
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;

    //private String name;
    //private int number;
}
是的..所以呢?
public class SerializableClass implements Serializable {
    static final long serialVersionUID = 1L;
    public int A;
    protected String value;
    //private String name;
    //private int number;
}
酷..一切都继续进行。这样我就完成了我的第一篇文章。我想把这些都写在评论里,但我无法通过符号。我会接受清醒的批评和评论 PS 感谢启发我做这些快乐的作者。可能,这就是他们学习的方式:)祝大家好运:)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION