当前位置: 首页 > article >正文

【高级编程】Java IO流(补)序列化 反序列化

序列化(ObjectOutputStream) & 反序列化(ObjectInputStream)


Java的序列化和反序列化是用于将对象转换为字节流的过程,以便在网络上传输或保存到磁盘,然后将这些字节流再转换回对象。这个过程是Java中处理对象持久化和传输的常见方法。

序列化是将对象的状态转换为字节流的过程。这个字节流可以被保存到文件、发送到网络,或者其他存储介质中。序列化使得对象可以被持久化,以便在未来重新创建该对象。

反序列化是将字节流转换回对象的过程。它是序列化的逆过程,通过读取字节流并重建原来的对象。

  • 序列化:内存(Java对象) → 流(二进制的字节序列) 将对象的状态写入到特定的流中的过程
  • 反序列化:流(二进制的字节序列) → 内存(Java对象) 从特定的流中获取数据重新构建对象的过程

在Java中,序列化通过实现 java.io.Serializable 接口来实现。Serializable 接口是一个标记接口,没有任何方法。其存在的意义是告诉Java虚拟机(JVM)某个类的对象可以被序列化。

流之间的关系概述

OutputStream ==> ObjectOutputStream(OutputStream) ==> FileOutputStream

InputStream ==> ObjectInputStream(InputStream) ==> FileInputStream

// Student 类需要实现 Serializable 接口
class Student implements java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;

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

    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}
public class ObjectTest {
    public static void main(String[] args) {
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;

        try {
            // 序列化
            oos = new ObjectOutputStream(new FileOutputStream("D:\\1.txt"));
            Student student = new Student("张三", 17);
            oos.writeObject(student); // 写入对象
            System.out.println("写入成功!!!");

            // 反序列化
            ois = new ObjectInputStream(new FileInputStream("D:\\1.txt"));
            Student stu = (Student) ois.readObject();
            System.out.println(stu.toString());
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            // 释放资源
            try {
                if (oos != null) oos.close();
                if (ois != null) ois.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

序列化的步骤

实现Serializable接口;创建对象输出流;调用 writeObject() 方法将对象写入文件;关闭对象输出流

使用集合保存对象,可以将集合中的所有对象序列化

反序列化的步骤

实现Serializable接口;创建对象输入流;调用 readObject() 方法读取对象;关闭对象输入流

如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取


http://www.kler.cn/a/299999.html

相关文章:

  • BW复制ERP数据源跑程序激活后才可见
  • 【LeetCode】--- MySQL刷题集合
  • C语言-----扫雷游戏
  • iOS开发设计模式篇第二篇MVVM设计模式
  • 开发环境搭建-1:配置 WSL (类 centos 的 oracle linux 官方镜像)
  • 数据结构——实验一·线性表
  • Pyspark下操作dataframe方法(1)
  • eNUM 原理概述(VoNR VoLTE适用) eNUM 报文解析
  • Vue2使用Vue CLI学习笔记
  • python 实现kadanes卡达内斯算法
  • 基于协同过滤算法+SpringBoot+Vue+MySQL的商品推荐系统
  • 人工智能帮你管理 ADHD 的7种方法
  • [Git使用] 实战技巧
  • 建造者模式builder
  • 九月五日(k8s配置)
  • 【学习笔记】手写Tomcat 二
  • 使用Python的内置的turtle模块来绘制中秋节快乐场景
  • 每日一题 二分查找分巧克力
  • 下班后做小红书第7个月,涨粉7w,累计变现5w+,我只用到五个点
  • 微前端 - 对外只开放一个端口
  • 23. C 语言,%d 和 %i的区别
  • Python 数据分析— Pandas 基本操作(下)
  • react js 笔记 3
  • 获取时间,并将时间按一定的格式输出
  • C++:sort自动排序函数
  • cell phone teardown 手机拆卸