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

简介: 这篇文章介绍了Java中ObjectInputStream和ObjectOutputStream类的基本使用,这两个类用于实现对象的序列化和反序列化。文章解释了序列化的概念、如何通过实现Serializable接口来实现序列化,以及如何使用transient关键字标记不需要序列化的属性。接着,通过示例代码演示了如何使用ObjectOutputStream进行对象的序列化和ObjectInputStream进行反序列化。

序列化流

  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啊,别被误导 👻

相关文章
|
29天前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
96 1
|
29天前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
125 1
|
29天前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
99 1
|
5月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
84 0
|
JSON 安全 编译器
扩展类实例的序列化和反序列化
扩展类实例的序列化和反序列化
154 1
|
5月前
|
存储 Java 编译器
说一说关于序列化/反序列化中的细节问题
我是小假 期待与你的下一次相遇 ~
|
5月前
|
JSON Java 数据库连接
|
6月前
|
存储 安全 IDE
说一说序列化与反序列化中存在的问题
本文详细解析了Java中的序列化机制,包括序列化的概念、实现方式及应用场景。通过Student类的实例演示了对象的序列化与反序列化过程,并分析了`Serializable`接口的作用以及`serialVersionUID`的重要意义。此外,文章还探讨了如何通过自定义`readObject()`方法增强序列化的安全性,以及解决可序列化单例模式中可能产生的多实例问题。最后提供了代码示例和运行结果,帮助读者深入理解序列化的原理与实践技巧。
146 2
|
6月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
12月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
424 1