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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值