序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】

序列化流 ObjectInputStream 和 ObjectOutputStream 的基本使用【 File类+IO流知识回顾④】

序列化流

  1. 什么是序列化?
  2. 如何实现序列化?
  3. 什么是反序列化?
  4. 需要了解的类 ObjectInputStream ObjectOutputStream

序列化和反序列化

Java 序列化是一种将对象转换为字节流的过程,以便可以将对象保存到磁盘上,将其传输到网络上,或者将其存储在内存中,以后再进行反序列化,将字节流重新转换为对象。

简单点说:Java提供了对象序列化的机制,用一个字节序列可以表示一个对象,字节序列中包含了该对象的数据对象的类型对象中存储的属性等信息。并且这个字节序列可以被反序列化,即从文件中读取处理,重构为一个对象。

在这里插入图片描述

如何实现序列化

序列化在 Java 中是通过 java.io.Serializable 接口来实现的,该接口没有任何方法,只是一个标记接口,用于标识类可以被序列化。

一个类要想实现序列化,必须必须实现 Serializable接口,Serializable是一个标记接口,没有任何方法。若不实现此接口,而去序列化,则会抛出NotSerializableException 异常。

如果类中的某些属性,不想序列化,则使用 transient 关键字,表示此属性是瞬态的,不需要序列化。

public class Student implements Serializable {
   

    // 指定序列版本号 --- 若不指定,可能会出现 InvalidClassException 异常
    private static final long serialVersionUID = 1L;

    private String name;
    private String sex;
    private int age;
    private transient String address; // address不被序列化

    public Student() {
   
    }

    public Student(String name, String sex, int age, String address) {
   
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
    }

    public String getName() {
   
        return name;
    }

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

    public String getSex() {
   
        return sex;
    }

    public void setSex(String sex) {
   
        this.sex = sex;
    }

    public int getAge() {
   
        return age;
    }

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

    public String getAddress() {
   
        return address;
    }

    public void setAddress(String address) {
   
        this.address = address;
    }

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

ObjectOutputStream

ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久储存。

构造方法:public ObjectOutputStream(OutputStream out) 创建一个指定的OutputStream的ObjectOutputStream。

序列化例子(public final void writeObject (Object obj) : 将指定的对象写出。):

// 1.创建学生类对象-为序列化准备数据
Student student = new Student("zhangsan", "man", 21, "huhehaote");
// 2.设置序列化位置
String optPath = "D:\\st.txt";
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(optPath));
// 3.开始序列化
oot.writeObject(student);
oot.close();

ObjectInputStream

ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象。

构造方法public ObjectInputStream(InputStream in): 创建一个指定InputStream的ObjectInputStream。

反序列化例子:public final Object readObject () : 读取一个对象。

// 反序列化
String filePath = "D:\\st.txt";
// 1.创建对象
Student student = new Student();
// 2.ObjectInputStream对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filePath));
Student o = (Student)in.readObject();
System.out.println(student);
in.close();

注意上面的例子,为了简洁我都直接将异常抛出了,实际情况肯定使用try-cath啊,别被误导 👻

相关推荐

  1. ObjectInputStreamObjectOutputStream在TCP使用

    2024-01-31 13:12:03       47 阅读
  2. 13.异常、IO序列序列

    2024-01-31 13:12:03       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 13:12:03       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 13:12:03       97 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 13:12:03       78 阅读
  4. Python语言-面向对象

    2024-01-31 13:12:03       88 阅读

热门阅读

  1. C++ 蓝桥杯历届试题 —— 小苹果题目情景及代码

    2024-01-31 13:12:03       59 阅读
  2. Delphi 析构函数(Destructor)

    2024-01-31 13:12:03       52 阅读
  3. k8s学习-通过Service访问Pod

    2024-01-31 13:12:03       49 阅读
  4. PyCharm常用快捷键和设置

    2024-01-31 13:12:03       52 阅读
  5. Centos 查看版本

    2024-01-31 13:12:03       56 阅读
  6. LeetCode每日一题 | 2670. 找出不同元素数目差数组

    2024-01-31 13:12:03       62 阅读
  7. 《Docker极简教程》--前言--本书的目的和目标

    2024-01-31 13:12:03       61 阅读
  8. 一次Rust重写基础软件的实践(三)

    2024-01-31 13:12:03       45 阅读
  9. SpringBoot实现动态数据源配置

    2024-01-31 13:12:03       52 阅读
  10. 1.29C语言 sscanf函数的用法 abs整数绝对值函数

    2024-01-31 13:12:03       54 阅读
  11. 数据结构-并查集

    2024-01-31 13:12:03       53 阅读
  12. vant滚动条下滑与下拉刷新冲突

    2024-01-31 13:12:03       53 阅读
  13. React 基础学习02

    2024-01-31 13:12:03       51 阅读
  14. 2024/1/30 备战蓝桥杯 3-1 栈

    2024-01-31 13:12:03       56 阅读