Serializable
是 Java 中的一个接口,表示一个类可以被序列化。序列化是指将对象转化为字节流的过程,这个字节流可以被传输或者持久化到硬盘上,也可以在程序内部保存。当需要读取这个对象时,可以通过反序列化将字节流重新转化为对象。
在 Java 中,所有实现 Serializable
接口的类都可以进行序列化和反序列化操作。若没有实现 Serializable
接口,则会抛出 NotSerializableException
异常。
需要注意的是,序列化和反序列化会涉及到对象的版本号问题。如果序列化的对象版本号和反序列化的对象版本号不一致,就会抛出 InvalidClassException
异常。因此,建议在实现序列化接口的类中显式地声明一个 serialVersionUID
静态变量,用于指定类的版本号,以保证版本号的唯一性和稳定性。
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getter 和 setter 方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在上述代码中,Person
类实现了 Serializable
接口,并显式地声明了一个版本号标识符 serialVersionUID
,它用于指定类的版本号,以保证序列化和反序列化过程中版本号的一致性。
当需要对一个 Person
对象进行序列化操作时,可以通过 ObjectOutputStream
将其转换为字节流:
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"))) {
Person person = new Person("Tom", 25);
oos.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
反之,当需要对字节流进行反序列化操作时,可以通过 ObjectInputStream
将其转换为 Person
对象:
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
Person person = (Person) ois.readObject();
System.out.println(person);
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}