Serializable@Java

263 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情 >>

问题描述: 在写代码的时候 大家经常会implements Serializable,本期就来带大家一起来 了解一下implements Serializable到底是为了干些什么事情。

  • 先说一下序列化和反序列化
    • 把对象转换为字节序列的过程称之为对象的序列化,可以将其保存到磁盘文件中或通过网络发送到任何其他程序。
    • 从字节流创建对象的相反过程称为反序列化。

如何实现一个序列化操作?
我们的 JAVA提供了一个 Serializable 接口,同时实现了 Serializable 接口后 IDE会提示我们生成一个serialVersionUID ,那么这个 serialVersionUID 究竟是一个什么的东西呢? 稍后揭晓

  • 如何实现序列化与反序列化

    • 定义实体类
    @Data
    public class User implements Serializable {
    
        private static final long serialVersionUID = -7544045581257242668L;
        /**
         *姓名
         */
        private String name;
        /**
         *年龄
         */
        private Integer age;
        /**
         *身高
         */
        private String hight;
    
    • 序列化与反序列操作
    public class SerializableDemo {
    
    public static void xuliehua(User user) {
    
    try {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("user11")));
        oos.writeObject(user);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
    
    public static void fanxuliehua() {
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("user11")));
        User user = (User) ois.readObject();
        System.out.println(user);
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
        public static void main(String[] args) {
            User user = new User();
            user.setName("张三");
            user.setAge(18);
            // 序列化
            xuliehua(user);
            // 反序列化
            fanxuliehua();
        }
    }
    

    项目下生成了一个user文件,如图: 1.png 640.jpg

222222.jpg 打开user文件你会看到:

640 (1).jpg

  • serialVersionUID的真正意义

我们先调用序列化方法,然后对serialVersionUID进行注释后,再调用反序列化方法,查看结果:

public static void main(String[] args) {
    User user = new User();
    user.setName("张三");
    user.setAge(18);
    // 序列化
    xuliehua(user);
    // 反序列化
    // fanxuliehua();
}

public class User implements Serializable {
    // private static final long serialVersionUID = -7544045581257242668L;
    private String name;
    private Integer age;
    public static int height = 11;
    public static void main(String[] args) {
    User user = new User();
    user.setName("张三");
    user.setAge(18);
    // 序列化
    // xuliehua(user);
    // 反序列化
    fanxuliehua(); 
}

异常信息,如图: 222222.jpg

结论 : 通过异常可以分析,serialVersionUID 作为一个版本号,其实主要目的是为了保持序列化时版本的兼容性,如果我们使用的并非同一个序列号进行序列化与反序列化,操作则会失败。

See you next time...