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();
}
本文介绍了Java中实现Serializable接口来实现对象的序列化和反序列化过程。序列化是将对象转化为字节流以便存储或传输,而反序列化则是将字节流恢复为对象。Person类作为示例展示了如何实现序列化,并强调了使用serialVersionUID确保版本一致性的必要性。同时,提供了使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化操作的代码示例。
809

被折叠的 条评论
为什么被折叠?



