类实现Serializable接口

序列化Serializable

Serializable 接口告诉JVM,实现该接口的类的对象可以被序列化,

是java实现对象存储和运输的技术

  • 例子

    @Data
    public class User implements Serializable {
        private static final long serialVersionUID = -1014711414691691142L;
        private String name;
        private int age;
       // private transient int height;
    }
    
    //Demo
     public static void main(String[] args) throws ParseException, IOException, ClassNotFoundException {
            User user = new User();
            user.setName("Jack");
            user.setAge(28);
            //序列化后持久化到文件
            ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("./user.txt"));
            os.writeObject(user);
            //读取序列化的对象
    //        ObjectInputStream is = new ObjectInputStream(new FileInputStream("./user.txt"));
    //        Object o = is.readObject();
    //        if (o instanceof User){
    //            User o1 = (User) o;
    //            System.out.println(o1.getName());
    //            System.out.println(o1.getAge());
    //        }
        }
    
  • 例子解读

    1. JVM是如何序列化和反序列化的

      解:序列化,过滤对象中没有transiend修饰的属性进行序列化,

      反序列化,读取字节序列后,还原成object,此时还原成对象时会通过serialVersionUID来确定是否还原成同一个类,若serialVersionUID不一致,则反序列化失败

    2. 为什么User类需要手动设置serialVersionUID常量属性

      解:即使不显式生成serialVersionUID,JVM也会自动为我们的类生成,但是JVM自动生成的SerialVersionUID对类的细节很敏感,e.g 在User类中增加了不会被序列化的transiend成员,此时JVM自动生成的SerialVersion就会改变

posted @ 2020-12-23 16:59  ylj-2021  阅读(253)  评论(0)    收藏  举报