serializable序列化
1、什么是序列化
1、简单来说,序列化就是将对象可以持久化存储,持久化存储的好处就是可以随时需要的时候再将文件转换回对象,这也就是serializable接口存在的意义
2、如果不实现serializable接口,在执行IO操作的时候,java会提示没有实现serializable
3、在代码实现的时候需要 实现 Serializable 接口 并 指定 serialVersionUID
2、什么是serialVersionUID标识
1、在JVM中,如果要持久化类,必须有一个指定的标识来确定反序列化时来确定哪个类来加载,如果判断反序列化时两个序列化标识不同,则会报错
2、如果不默认serialVersionUID,jvm会自动分配一个序列化标识,但是由于可能jvm在不同环境下生成的序列化标识不同,导致没有必要的错误,所以我们一定要将serialVersionUID在代码中标识出来,不要跟自己过不去
3、在idea中,想要自动生成serialVersionUID,需要先在Settings -> Plugins 插件管理中,搜索GenerateSerialVersionUID插件并安装,重启idea后,使用alt + insert快捷键 点击 serialVersionUID即可自动生成
3、代码实现
1、先创建一个User对象,给这个对象加上serializable接口标识,并且指定serialVersionUID
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
}
2、将该对象存储到本地,此时发现成功存入,但如果没有实现会报找不到序列化标识错误
private static void write() {
User user = new User("1001", "Bob");
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\user.txt"));
objectOutputStream.writeObject(user);
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3、从本地文件中加载对象,如果此时对象中的序列化标识与文件中的序列化标识不一致,则会报错
private static void read() {
try {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("D:\\user.txt"));
User user = (User) inputStream.readObject();
System.out.println(user);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}