09 序列化对象


1 对象序列化

对象序列化:

使用到的流是对象字节输出流:ObjectOutputStreamd

● 作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化

IO体系结构图

对象字节输出流:ObjectOutputStream

构造器 说明
public ObjectOutputStream(OutputStram out) 将低级字节输出流包装成高级的对象字节输出流

ObjectOutputStream序列化方法

方法名称 说明
public final void writeObject(Object obj) 对象写出到对象序列化流的文件中

【示例】Student类

查看代码
public class Student implements Serializable {
    private String name;
    private String longinName;
    private transient String password;
    private int age;

    public Student() {
    }

    public Student(String name, String longinName, String password, int age) {
        this.name = name;
        this.longinName = longinName;
        this.password = password;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLonginName() {
        return longinName;
    }

    public void setLonginName(String longinName) {
        this.longinName = longinName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", longinName='" + longinName + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

【示例】序列化对象

public class ObjectOutputStreamDemo01 {
    public static void main(String[] args) throws Exception {
        //1.创建学生对象
        Student s = new Student("叶子","yezi","123123",21);

        //2.对象序列化:使用对象字节输出流包装字节输出流管道
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io-app2/src/obj.txt"));

        //3.直接调用序列化方法
        oos.writeObject(s);

        //4.释放资源
        oos.close();
        System.out.println();
        System.out.println("序列化完成了~");
    }
}

2 对象反序列化

对象反序列化

● 使用到的流是对象字节输入流:ObjectInputStream

● 作用:以内存为基准,把存储到磁盘文件中的对象数据恢复成内存中的对象,称为对象反序列化。

构造器 说明
public ObjectInputStream() 将低级字节输入流包装成高级的对象字节输入流

ObjectInputStream序列化方法

方法名称 说明
public Object readObject( ) 将存储到磁盘文件中的对象数据恢复成内存中的对象返回

【示例】

package com.itheima.d5_serializable;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ObjectInputStream;

public class ObjectInputStramDemo02 {
    public static void main(String[] args) throws Exception {
        //1. 创建对象字节输入流管道包装低级的字节输入流管道
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io-app2/src/obj.txt"));

        //2. 调用对象字节输入流的反序列化方法
        Student s = (Student) ois.readObject();

        System.out.println(s);
    }
}

 运行结果:

Student{name='叶子', longinName='yezi', password='null', age=21}

补充:

transient修饰的成员变量不参与序列化

● 声明序列化的版本号号

● 序列化的版本号与反序列化的版本号必须一致才不会出错

【示例】

查看代码
/**
  对象如果要序列化,必须实现Serializable序列化接口。
 */
public class Student implements Serializable {
    // 申明序列化的版本号码
    // 序列化的版本号与反序列化的版本号必须一致才不会出错!
    private static final long serialVersionUID = 1;
    private String name;
    private String loginName;
    // transient修饰的成员变量不参与序列化了
    private transient String passWord;
    private int age ;

    public Student(){
    }

    public Student(String name, String loginName, String passWord, int age) {
        this.name = name;
        this.loginName = loginName;
        this.passWord = passWord;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", loginName='" + loginName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", age=" + age +
                '}';
    }
}