• 95-Java的对象序列化、反序列化


    一、对象序列化

    • 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
    • 使用到的流是对象字节输出流:ObjectOutputStream

    在这里插入图片描述


    在这里插入图片描述



    1、构造器
    构造器说明
    public ObjectOutputStream(OutputStream out)把字节输出流包装成对象字节输出流

    2、序列化方法
    方法名称说明
    public final void writeObject(Object obj)将指定对象写入到磁盘文件中

    package com.app.d5_serializable;
    
    import java.io.Serializable;
    
    /**
        定义学生类:
            对象如果要序列化,必须实现 Serializable(序列化接口)
     */
    public class Student implements Serializable {
        /**
            学生属性:姓名、年龄、登录名称、密码
         */
        private String name;
        private int age;
        private String loginName;
        private String passWord;
    
        public Student() {
    
        }
    
        public Student(String name, int age, String loginName, String passWord) {
            this.name = name;
            this.age = age;
            this.loginName = loginName;
            this.passWord = passWord;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getLoginName() {
            return loginName;
        }
    
        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }
    
        public String getPassWord() {
            return passWord;
        }
    
        public void setPassWord(String passWord) {
            this.passWord = passWord;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", loginName='" + loginName + '\'' +
                    ", passWord='" + passWord + '\'' +
                    '}';
        }
    }
    

    package com.app.d5_serializable;
    
    import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
    
    /**
        目标:学会对象序列化,使用 ObjectOutputStream 把内存中的对象存入到磁盘文件中。
     */
    public class ObjectOutputStreamDemo01 {
        public static void main(String[] args) {
            // 1、创建学生对象
            Student s = new Student("吴磊", 22, "wulei", "123abc");
    
            try (
    
                    // 2、对象序列化:使用对象字节输出流包装字节输出流
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day11-io2-app/src/obj.txt"));
    
                    ) {
    
                // 3、直接调用序列化方法
                oos.writeObject(s);
    
                System.out.println("对象序列化完成~~");
    
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    在这里插入图片描述



    总结

    1、对象序列化的含义是啥?

    • 把对象数据存入到文件中

    2、对象序列化用到哪个流?

    • 对象字节输出流:ObjectOutputStream
    • 序列化方法:public final void writeObject(Object obj)

    3、序列化对象的要求是怎么样的?

    • 对象必须实现序列化接口



    二、对象反序列化

    • 作用:以内存为基准,把存储到磁盘文件中的对象数据恢复成内存中的对象,称为对象反序列化
    • 使用到的流是对象字节输入流:ObjectInputStream。

    在这里插入图片描述


    在这里插入图片描述


    1、构造器
    构造器说明
    public ObjectInputStream(InputStream in)把字节输入流包装成对象字节输入流

    2、反序列化方法
    方法名称说明
    public final Object readObject()把存储到磁盘文件中的对象数据恢复成内存中的对象返回

    package com.app.d5_serializable;
    
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    
    /**
        目标:学会对象反序列化:使用 ObjectInputStream 把磁盘文件中的对象数据恢复成内存中的Java对象
     */
    public class ObjectInputStreamDemo02 {
        public static void main(String[] args) {
            try(
    
                    // 1、创建对象字节输入流包装字节输入流
                    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day11-io2-app/src/obj.txt"));
    
                    ) {
    
                // 2、调用对象字节输入流的反序列化方法,将磁盘文件中的对象数据恢复成内存中的Java对象
                Student s = (Student) ois.readObject();
                System.out.println("反序列化完成~~");
                System.out.println(s);
    
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    反序列化完成~~
    Student{name='吴磊', age=22, loginName='wulei', passWord='123abc'}
    
    Process finished with exit code 0
    
    



    三、对象序列化的注意点

    1、transient关键字
    • 实际开发中,如果将对象的所有信息都序列化到磁盘文件中,那么有些隐私信息容易被泄露出去。

      在这里插入图片描述


    • 所以,只要是不想泄露某些信息出去的,可以使用 transient 修饰成员变量

      在这里插入图片描述


    • 现在运行看看

      在这里插入图片描述
      在这里插入图片描述


    在这里插入图片描述

    在这里插入图片描述




    2、序列化版本号
    • 申明序列化的版本号码
    • 序列化的版本号与反序列化的版本号码必须一致才不会报错!!

    在这里插入图片描述


    作用
    • 假如哪天有业务需求,需要在对象类里增加几个新字段,然后将序列化版本号升级为2
    • 必须重新序列化一遍,然后反序列化才不会出错!!否则就会报错!!


    总结

    1、对象反序列化的含义是啥?

    • 把磁盘中的对象数据恢复到内存的Java对象中

    2、对象反序列化用到了哪个流?

    • 对象字节输入流:ObjectInputStream
    • 反序列化方法:public final Object readObject()
  • 相关阅读:
    09 编译2022年最新的Linux kernel、U-Boot和BusyBox rootfs源码,并用QEMU模拟器运行
    【周赛+双周赛20220904】T4
    类与对象(中级)
    关于VS2019启动调试项目时提示拒绝访问
    Water 2.6.3 发布,一站式服务治理平台
    2022-09-13 mysql列存储引擎-POC-查询数据错误追踪
    Vue3 学习总结笔记 (十三)
    Nodejs+vue网上鲜花店销售信息系统express+mysql
    企业数字化时代,浅谈数据分析报告
    佘太地纯的前世今生
  • 原文地址:https://blog.csdn.net/yelitoudu/article/details/127109807