Serializable接口

74 阅读1分钟

现象

一般在定义实体类时,发现都会实现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,从而导致反序列化不成功。