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

news2024/12/24 8:50:06

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

    • 序列化流
      • 序列化和反序列化
      • 如何实现序列化
      • 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啊,别被误导 👻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯嵌入式——省赛模板构建

新建一个省赛模板文件夹,在里面存放上源工程和目标工程 打开STM32CubeMX新建工程 选择芯片为STM32G431RBT6 CubeMX配置时钟系统 NVIC中断优先级分组为组4 RCC的高速时钟配置为晶振

【AI视野·今日Robot 机器人论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 15 Jan 2024 Totally 14 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Learning Joint Space Reference Manifold for Reliable Physical Assistance Authors Amirreza Razmjoo, Tilen Brecelj, Kri…

SpringClound项目相关

nacos本机模式非虚拟机启动也可正常连接 nacos中的配置中心相当于在application.yml中的相关配置,转移位置,内容同application.yml完全一样均可。 黑马项目导入后,依赖缺失: 首先尝试maven重新加载,控制台提示传递依…

高精度加法模板,包装结构体

本题链接:用户登录 题目: 样例: 输入 123 456 输出 579 模板结构体: struct BigInt {string values;inline BigInt Add(const BigInt &ta,const BigInt &tb){BigInt ans;ans.values "";string sa ta.values…

ETL怎么实现文件处理

在现代企业及各类组织的日常运作中,数据作为一种关键的信息资源,其管理和分析能力直接影响到决策效率与准确性。文件作为数据的主要载体,承载着从运营报告、客户记录、交易明细等各种类型的数据信息。这些海量且多样的文件数据在未经处理的情…

道理都懂,就是做不到,怎么办?

世界上最遥远的距离是什么? 我想,对许多人来说,多半是「知」与「行」之间的距离。 想一想,你有多少次发出感叹:这些我都知道,但我就是做不到,怎么办呢? 有多少次,你反复告…

matlab自定义函数实现图像小波变换

matlab中提供了小波变换函数lwt和ilwt,可以方便地实现提升小波变换。 我们按照小波变换的定义,粗糙地实现一个针对图像的小波变换,如下: % 使用方法: img imread(lena256.bmp); % 假设lena.png是灰度图像 subplot(2…

dom监听元素 从display: none到页面中

其实业务中还是会碰见这样的需求的,特别是一些框架内不,这个并不是很复杂,我们可以考虑如何去监听到 dom元素样式属性的变化就可以 很多童鞋可能对原生js的不够熟悉,现在大多数同学 只要会写简单的vue操作 就可以 做一些基础的前…

华为配置在用户物理位置变化时部署业务随行示例(V200R006C00、V200R007C00、V200R008C00)

配置在用户物理位置变化时部署业务随行示例(V200R006C00、V200R007C00、V200R008C00) 业务随行简介配置注意事项组网需求需求分析数据规划配置思路操作步骤配置文件 组网图形 图1 组网图 业务随行简介配置注意事项组网需求需求分析数据规划配置思路操作步…

【Time Series】LSTM代码实战

一、简介 还是那句话,"时间序列金融"是一个很有"钱"景的话题,还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络(LSTM)是一种特殊的循环神经…

瑞士0.5米高程地形瓦片数据介绍

一、背景 瑞士是位于中欧的一个国家,以其美丽的自然风光、高质量的生活和强大的金融体系而闻名,其位于欧洲中部,四面环山,与德国、法国、意大利、奥地利和列支敦士登等国家接壤。瑞士境内有许多湖泊和阿尔卑斯山脉的一部分。瑞士…

Redis常见数据类型[上]

目录 前言: 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构和内部编码 内部编码: 单线程架构 引出单线程模型: 为什么单线程还这么快? String字符串 字符串数据类型: 常见命令: S…

uniapp微信小程序-分包

一、为什么要分包 微信小程序每个分包的大小是2M,总体积一共不能超过20M,当然你也可以提升启动速度,降低首次加载时间,模块化开发,按需加载,提高性能。 二、分包步骤 1.首先在 mainfest.json mp-weixin添加以下代码&a…

用Python库pillow处理图像

入门知识 颜色。如果你有使用颜料画画的经历,那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色,事实上这三种颜色就是美术中的三原色,它们是不能再分解的基本颜色。在计算机中,我们可以将红、绿、蓝三种色光以不同的比例叠加…

Git快速入门+常用指令

Git创建本地仓库 1、创建一个文件夹,右键选择Git Bash Here 2、选择下列其中一个方法 方法一:创建初始化仓库 git init 方法二:克隆远程仓库 git clone [url] IDEA集成Git 按步骤操作会自动创建本地仓库 上传步骤 1、提交 2、输入上…

客户端熔断器基于golang Grpc具体实现

目录 前言 一、什么是Google SRE 二、Google SRE 熔断器的工作流程: 三、Google SRE GRPC 代码实现 四、测试用例 大家可以关注个人博客:xingxing – Web Developer from Somewhere 有关后端问题探讨 前言 当某个用户超过资源配额时&#xff0c…

EPSON RC 机器人-第一个程序

创建项目 有机械人且用USB线连接好。可以USB。没有真机的选择 C4 Sample 可以运行程序。 否刚会提示【不能连接到控制器,未安装USB驱动器】 代码 按F5打开运行窗口 再点【开始】 点 【是】,查看运行结果

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID? 日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

[BUUCTF]-Web:[GXYCTF2019]Ping Ping Ping解析

先看网页 按照正常流程&#xff0c;先ipls&#xff0c;可以看到flag 但是不能直接得flag&#xff0c;他应该是过滤掉了一点东西。 这里考虑过滤掉了空格 空格过滤绕过&#xff1a; %20 %09 ${IFS} $IFS$1 {IFS} < <> 空格绕过之后发现还是打不开flag.php,但报错语句…