现象
一般在定义实体类时,发现都会实现Serializable接口
public class Employee implements Serializable{
private static final long serialVersionUID = 1L;
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
private String password;
}
什么是Serializable接口
Serializable接口是一种标识,代表着该类可以被序列化为字节流,也可以被反序列化为对象。Serializable接口中没有任何方法或变量,只作为一个标识,通知jvm这个类需要被序列化。
序列化的作用
网络传输中数据以字节流通讯,序列化因此可以将对象在网络中传输,还可以将对象写入到文件中(即信息持久化)
class RuijiApplicationTests {
@Test
void test() throws IOException, ClassNotFoundException {
User user = new User(21);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\test.txt"));
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\test.txt"));
objectOutputStream.writeObject(user);
User user1 = (com.example.ruiji.User) objectInputStream.readObject();
objectOutputStream.close();
objectInputStream.close();
}
}
class User implements Serializable{
public static final Long serialVersionUID = 1L;
private int age;
public User(int age) {
this.age = age;
}
@Override
public String toString() {
return "user{" +
"age=" + age +
'}';
}
}
若User类没有实现Serializable接口,则jvm不知道要将user对象进行序列化,则不能通过IO流对user对象进行写入和解析为对象。 报错:java.io.NotSerializableException: com.example.ruiji.User 意思为User是不可序列化的
serialVersionUID
在序列化时会将serialVersionUID写入到字符流中,在反序列化时,会将字符流中的serialVersionUID和类中的进行对比,以判断字符流中的类和当前类是否相等,若相等再进行反序列化。
若用户没有自定义serialVersionUID,jvm会自动生成一个serialVersionUID,但官方强烈建议用户自己申明。因为若类的成员发生了变化,jvm将会重新分配一个UID,从而导致反序列化不成功。