• 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属性也不会被序列化.

  • 相关阅读:
    c# listbox
    第三章、组织代码
    Qt扫盲-QSqlField 理论总结
    MySQL高级SQL语句(1)
    数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大特点分析
    医疗机构又进化了,一招搞定UPS设备太爽了!
    c语言使用fdk_aac库对aac音频解码为pcm
    阿里8年测试经验,耗时一个月整理的40道自动化测试面试真题(附精准答案解析)足足手写2W字
    算法-卡尔曼滤波之卡尔曼滤波的其他三个方程
    python数据分析之Pandas库(一)
  • 原文地址:https://blog.csdn.net/m0_51527921/article/details/126619504