• Java序列化为什么必须实现 Serializable 接口


    • 序列化:把对象转换为字节序列的过程称为对象的序列化.
    • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化.

    什么时候需要用到序列化和反序列化呢?

    • 将内存中的对象持久化到磁盘或者数据库中
    • 与浏览器进行交互时,流行的Rest风格的接口
    • 需要实现RPC分布式服务间调用(Registry ,Provider,Consumer)

    综上,只要我们对内存中的对象进行持久化或网络传输, 这个时候都需要序列化和反序列化.

    在Java中实现了Serializable接口后, JVM会在底层帮我们实现序列化和反序列化

    比如我们常用的String对象,就实现了Serializable接口,并显示指定了serialVersionUID

    在这里插入图片描述

    实例说明

    @Data
    public class User implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private String name;
        private Integer age;
        private transient String sex;
        private static String signature = "你眼中的世界就是你自己的样子";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    public class SerializableTest {
    
        private static void serialize(User user) throws Exception {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:\\111.txt")));
            oos.writeObject(user);
            oos.close();
        }
    
        private static User deserialize() throws Exception{
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:\\111.txt")));
            return (User) ois.readObject();
        }
    
        public static void main(String[] args) throws Exception {
            User user = new User();
            user.setName("ddw");
            user.setAge(18);
            user.setSex("1");
            System.out.println("序列化前的结果: " + user);
    
            serialize(user);
    
            User dUser = deserialize();
            System.out.println("反序列化后的结果: "+ dUser);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    user没有实现Serializable 接口,会报错无法序列化
    在这里插入图片描述
    没有指定serialVersionUID时,先序列化,然后修改类,增加一个属性,再发序列化,就会报错不合法的类异常,两个序列化版本不一致,无法反序列化
    在这里插入图片描述
    所以我们一般会显示指定版本号,值是多少无所谓,保持一致就可以
    private static final long serialVersionUID = 1L;

    如果不显示指定serialVersionUID, JVM在序列化时会根据属性自动生成一个serialVersionUID,
    然后与属性一起序列化, 再进行持久化或网络传输. 在反序列化时, JVM会再根据属性自动生成一个新版serialVersionUID,
    然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功,
    否则报错.

    transient关键字修饰的属性不会被序列化, static属性也不会被序列化.

  • 相关阅读:
    devc++ 使用 winsock 实现 UDP 局域网 WIFI 广播
    springcloud14:gateway总结
    Leetcode 82. Remove Duplicates from Sorted List II
    pip换源加速下载
    java学习--day12 (多态)
    【AUTOSAR-Nm】-2.2-通过CAN/Lin...信号报告Nm状态机的跳转
    Python函数传递参数
    数据库_JDBC
    机器学习界的GitHub:估值20亿美元的Hugging Face为何受到资本青睐?
    【电路笔记】-电路中的复数与相量(Phasor)
  • 原文地址:https://blog.csdn.net/m0_51527921/article/details/126619504