详解Java中的serialVersionUID概念以及作用
warning:
这篇文章距离上次修改已过286天,其中的内容可能已经有所变动。
serialVersionUID
是Java序列化机制中用于识别类版本的一个独特的ID。当对象被序列化后,serialVersionUID
用于验证反序列化时对象的类版本是否与序列化时的类版本一致。
如果serialVersionUID
相同,则认为序列化的对象和反序列化的对象属于同一个类,可以成功反序列化。如果serialVersionUID
不同,则会抛出InvalidClassException
异常,表示序列化的对象和反序列化的对象不属于同一个类,不能进行反序列化。
解决方案:
- 如果你是类的开发者,并且确信更改不会影响兼容性,你可以显式地定义
serialVersionUID
。 - 如果你希望在每次类的改变后都产生一个新的版本,可以让IDE自动生成一个新的
serialVersionUID
。
实例代码:
import java.io.*;
public class SerializationDemo {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public SerializationDemo(String name, int age) {
this.name = name;
this.age = age;
}
public void serialize(String filename) throws IOException {
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(this);
oos.close();
}
public static SerializationDemo deserialize(String filename) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
SerializationDemo obj = (SerializationDemo) ois.readObject();
ois.close();
return obj;
}
public static void main(String[] args) {
try {
// 创建对象并序列化
SerializationDemo obj = new SerializationDemo("Alice", 30);
obj.serialize("serialization.ser");
// 反序列化
SerializationDemo deserializedObj = deserialize("serialization.ser");
System.out.println("Name: " + deserializedObj.name);
System.out.println("Age: " + deserializedObj.age);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们定义了一个SerializationDemo
类,并为其指定了serialVersionUID
。然后我们可以对这个类进行序列化和反序列化操作。如果类的结构没有改变,serialVersionUID
保持不变,序列化和反序列化可以成功进行。如果类的结构有所改变(例如添加或删除字段),应当更改serialVersionUID
以确保兼容性。
评论已关闭