首页 > 编程语言 >【高级编程】Java IO流(补)序列化 & 反序列化

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

时间:2024-09-11 11:52:53浏览次数:3  
标签:Java IO 对象 Student new 序列化 字节

序列化(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() 方法读取对象;关闭对象输入流

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

标签:Java,IO,对象,Student,new,序列化,字节
From: https://blog.csdn.net/m0_66584716/article/details/142099709

相关文章

  • 基于JavaWeb开发的java eclipse+jsp+mysql+servlet+Spring的学生信息管理系统基础版
    基于JavaWeb开发的javaeclipse+jsp+mysql+servlet+Spring的学生信息管理系统基础版......
  • 【高级编程】Java IO流(下)字符流 Reader Writer 字节流读取二进制文件
    文章目录ReaderFileReaderBufferedReaderWriterFileWriterBufferedWriter读写二进制文件ReaderReader是一个抽象类,用于读取字符流。它是所有字符输入流的基类。Reader提供了一些基本的方法来读取字符数据intread()//读取单个字符,并返回一个整数。如果到达流......
  • 【高级编程】认识Java多线程 代码举例三种创建线程的方式
    文章目录主线程创建线程方式1:Thread方式2:Runnable方式3:Callable进程:应用程序的执行实例,有独立的内存空间和系统资源线程:CPU调度和分派的基本单位,进程中执行运算的最小单位,可完成一个独立的顺序控制流程多线程:如果在一个进程中同时运行了多个线程,用来完成不同的工......
  • C# Dictionary(字典)的用法
    要使用Dictionary集合,需要导入C#泛型命名空间!​System.Collections.Generic​(程序集:mscorlib)Dictionary的描述1、从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成2、任何键都必须是唯一的3、键不能为空引用null(VB中的Nothing),若值为引用类......
  • [1059] Operations of None in pandas
    Inpandas,handlingNonevalues(whicharerepresentedasNaNinDataFrames)isacommontask.Herearesomewaystodealwiththem:FilteringRowsFilterRowswithNoneValues:importpandasaspd#SampleDataFramedf=pd.DataFrame({'A......
  • 2025让你爱不释手的iOS设备管理软件iMazing3!
    嘿,各位科技控的小伙伴们!今天给你们带来一款让你爱不释手的iOS设备管理软件——iMazing3!......
  • java常规web面试题考点
    在java的理论知识中,有一个模块作为最基础的组成,但在学习的难度上较大所以往这方面发展的人不多。其实这就是web模块,开发一些软件都离不开web方面的理论支撑。web面试题主要考察一些基础开发的工具的用法和实际代码运用的试题,下面我们来就具体的题目进行作答。1.网络编程首先要......
  • AI绘画:SD打光神器!(Stable Diffusion进阶篇:Imposing Consistent Light)
    前言在上一篇笔记中学习了如何简单地下载以及使用IC-Light,今天的内容会稍微有点不一样。对于学过stablediffusion的小伙伴来说,forgeUI和ComfyUI会更加熟悉一些。在IC-Light发布后,Openposeeditor的开发者将其制作成了一个ForgeUI上的插件。所有的AI设计工具,模型和插......
  • 【JAVA】第五天
    【JAVA】第五天一、Math类二、System类三、Runtime类四、BigDecimal类五、JDK8之前传统的日期、时间(不推荐)1.Date类2.SimpleDateFormat类3.Calendar类六、JDK8之后新增的日期、时间1.LocalDateTime类2.ZoneId类3.ZonedDateTime类4.Instant类5.DateTimeFormatter类6.Peri......
  • [JavaScript] 事件委托以及 Vue 列表循环事件绑定的性能优化
    前言事件委托(EventDelegation)是一种通过将事件监听器绑定到父元素,而不是直接绑定到每个子元素上的技术。这样可以减少事件监听器的数量,提升性能,并使得对动态添加或移除的元素更容易进行事件处理。事件冒泡和事件捕获事件冒泡:从里往外<divid="parent"style="padding:50px;......