Java中IO流之序列化和反序列化

Java基础IO流之序列化流的使用 ☆引言☆ 大家好,我是痛而不言笑而不语的浅伤。上一章我们学习了IO流中的递归,本章我们一起来学习IO流中的序列号流。这篇文章来自我的《吃透JavaSE基础》专栏中,想要学习更多JavaSE基础,订阅专栏《吃透JavaSE基础》。对文章中描述错误的希望大家积极指出。 🎉博客首页:痛而不言笑而不语的浅伤 🥳欢迎关注👍点赞收藏🎊留言 ❤:热爱Java学习,期待一起交流! 🙏🏻作者水平很有限,如果发现错误,求告知,多谢! 🥰有问题可以私信交流!!! ... 阅读详情

1、序列化

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

1)序列化: 将数据结构或对象转换成二进制串的过程

2)反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

2、对象的序列化主要有两种用途:

1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2) 在网络上传送对象的字节序列。

3、Java类库的序列化API

ObjectOutputStream代表对象输出流,它的writeObject(Objectobj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

 

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式 。

4、对象序列化包括如下步骤:

1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

2) 通过对象输出流的writeObject()方法写对象。

 

5、对象反序列化的步骤如下:

1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

2) 通过对象输入流的readObject()方法读取对象。

6、示例

首先我们新建一个学生类,包括姓名,年龄,性别,身高,四个属性:

package com.Serialization;

import java.io.Serializable;

/**
 * 这是一个学生类,实现了Serializable接口,可以被序列化
 */
public class Student implements Serializable {
    //姓名
    private String name;
    //年龄
    private int age;
    //性别
    private String sex;
    //身高
    private double height;
    // 不带参构造方法
    public Student() {
    }
    //带参构造方法
    public Student(String name, int age, String sex, double height) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.height = height;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", height=" + height +
                '}';
    }
}
然后新建一个用于序列化输出的类:

package com.Serialization;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 这是一个序列化输出的测试类
 */
public class OutputDemo  {
    public static void main(String[] args) {
        //实例化一个学生对象
        Student student=new Student("李佳奇",12,"女",170.0);
        //实例化一个文件对象
        File file=new File("D:/student.txt");
        //声明一个序列化输出流
        ObjectOutputStream oos=null;
        //如果文件不存在,就创建文件
        if(!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
                //实例化序列化输出流,指定输出文件
                oos=new ObjectOutputStream(new FileOutputStream(file));
                //将学生对象序列化输出
                oos.writeObject(student);
                System.out.println("序列化输出成功");
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭序列化输出流
            if (oos!=null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
这里我们运行程序,控制台输出:

再去看文件夹:


可以看到是一堆乱码,这是因为我们输出的时二进制字节,我们可以读取后再看看具体信息,所以我们再建一个用于序列化输入(反序列化)的类:

package com.Serialization;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class InputDemo {
    public static void main(String[] args) {
        //实例化一个学生类用来接收反序列化输入的对象
        Student student=new Student();
        //新建文件对象
        File file=new File("D:/student.txt");
        //声明一个序列化输入流
        ObjectInputStream ois=null;

        try {
            //实例化序列化输入流,指定输入文件
            ois=new ObjectInputStream(new FileInputStream(file));
            //读取文件里的对象
            student= (Student) ois.readObject();
            //在控制台打印对象信息
            System.out.println(student);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
运行这个程序后,控制台输出:

可以看到这正是我们序列化输出的信息!
如果我们一次想序列化输出多个对象,我们可以利用集合,将多个对象添加进集合,然后序列化输出结合对象,当然反序列化的时候我们得到的是一个集合对象,遍历这个集合就可以得到多个对象的信息。




科研级YOLOv8 Neck革新:BiFPN双向特征金字塔赋能,让多尺度融合更高效的实战指南 在文件夹下新建BiFPN.py,将上述BiFPNLayer和BiFPN类的代码写入其中。这一步是为了让YOLOv8的代码架构能识别我们的自定义Neck模块。 阅读详情

相关推荐

blenderproc 制作位姿估计数据集

blenderproc 制作位姿估计数据集 准备工作 1.首先需要去下载blenderproc的源码blenderproc,按照作者的readme文件进行编译。 2.其次需要下载bop_toolkit源码,链接如下bop_toolkit 3.说明:blenderproc主要用来生成数据,包括depth,rgb,位姿标签文件(scene_gt.json),bop_toolkit主要用来生成mask和mask_visib,scene_gt_info.json,用于判断物体的可见区域比例,如果遮挡太多考虑去掉。做

qq_43814359的博客 5697

Java的IO流与对象的序列化浅谈

今天再次回顾了一些关于java IO流的知识。虽然以前会点IO的方面的编程,但是还是知其然不知其所以然。 首先上一张IO流的主要家族图吧。           该图给出了IO流的具体分类和各类之间的继承关系。其中还给出了各个类的使用场景和用途。 一、IO流的主流分类     IO流主要分为字节流和字符流。它们之间的区别就是: 1、读写的单位不同,字节流是以字节(8bit)

XXiaoLEI的专栏 3453

ADS实战指南:负载牵引(Loadpull)在射频功放设计中的关键应用

本文深入解析了负载牵引(Loadpull)技术在射频功率放大器设计中的核心作用与实战方法。通过生动的比喻和详细的ADS软件操作指南,阐述了如何通过系统扫描负载阻抗,在史密斯圆图上绘制等功率线与等效率线,从而精准找到最优阻抗点,以平衡输出功率与效率,是应对5G等现代通信系统严苛要求的必备技能。

weixin_29198045的博客 601

javaIO流之序列流

Java 的序列流(ObjectInputStream 和 ObjectOutputStream)是一种可以将 Java 对象序列化和反序列化的流。序列化是指将一个对象转换为一个字节序列(包含对象的数据、对象的类型和对象中存储的属性等信息),以便在网络上传输或保存到文件中,或者在程序之间传递。在 Java 中,序列化通过实现 java.io.Serializable 接口来实现,只有实现了 Serializable 接口的对象才能被序列化。反序列化是指将一个字节序列转换为一个对象,以便在程序中使用。

恒二哥的博客 1049

2.2.1.3-移动平均线(python画k线、均线、5日线、买卖点图、python均线策略)

* 绘制一个k线图,也就是蜡烛图 * 计算5日均线值、10日均线值 * 在k线图上,绘制5日线和10日线图 * 在5日线上,绘制与10日线的交叉点(上穿、下穿时) python画k线、均线、5日线、买卖点图、python均线策略

KelvinLiu 3413

(超全面,超基础)Kriging插值推导理论笔记,算法,普通克里金

最近老师让我再重新推导一下克里金插值的方法如何求出预测结果,于是我又无数次地打开了大神的推导原理过程链接????:克里金(Kriging)插值的原理与公式推导 作者:xg1990,但是不可避免地在推导过程中,数学知识基础薄弱的我卡住在一些公式推导的步骤中。 所以就想基于上面大神的推导过程,将里面的推导写得更具体些,当然觉得毫不吃力可以进行推导的大神们可以不看我的注释,直接点开链接看就好。 我看到csdn中很多关于克里金推导的博客里面的内容直接截屏或者复制了上面链接里大神发表的内容,也不注

Olivel1997的博客 1万+

关于IO流及序列化

IO流 File 对文件进行操作 file访问的对象不存在时自动创建 部分磁盘创建文件可能会受到权限影响报错,在属性中修改 file创建的文件类型由方法决定不限于文件夹 创建目录: File类中有两个方法可以用来创建文件夹: **mkdir( )**方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。 **mkdirs()**方法创建一个文件夹和它的所有父文件夹。 注意: Java 在 UNIX 和 Win

weixin_45815335的博客 371

告别蓝牙音质妥协:用ESP32和PCM5102搭建WiFi无损音频播放器(附完整代码)

本文详细介绍了如何利用ESP32微控制器和PCM5102 DAC芯片构建一套完整的WiFi无损音频流媒体系统,彻底摆脱蓝牙协议的音质束缚。从硬件原理到软件实现,包括核心器件选型、电路设计、I2S音频驱动实现以及系统优化方案,帮助音频发烧友实现高保真无线音频传输。

weixin_30733003的博客 541

Java IO流学习—序列化与反序列化

Java IO流学习—序列化与反序列化 1、序列化与反序列化是什么 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在IO流中,序列化就是将对象的状态写入到特定的流中的过程,如:将Java对象序列化为二进制的字节序列。 反序列化就是序列化的反过来的过程。 2、序列化和反序列化中使用到IO流的类 1)序列化IO流(ObjectOutputStream) 序列化是将对象转换为流的过程,应该对应的就是输出流,使用的是ObjectOutputStream类 链接: Obje

a18211246446的博客 448

qPCRtools | 神仙R包分分钟搞定你的qPCR实验结果!~

1写在前面 不知道大家都是怎么完成qPCR的计算的,在不会R的时候,我是用一个祖传的Excel表进行计算的。🤣 但是,一直有个缺点,如果需要计算的量比较大时,就不方便了,去搜了一下文献,发现了一个最近发表的R包,不仅可以计算反转录的RNA体积,还可以帮助选择定量方法,简直是神仙R包,本期就介绍一下它的使用吧。🥰 感谢原作者的开发,嘿嘿,文末有引用方法。👀 2用到的包 rm(list = ls())library(tidyverse)library(ggsci)library(qPCRtools)librar

m0_72224305的博客 3983

使用 VPN 访问太理内部网相关问题总结【太原理工大学】

电脑连接 VPN,访问校园内部网相关问题总结,太原理工大学。

m0_52861684的博客 9873

Java IO流 、序列化与反序列化

使用File、IO流操作文件,创建文件、文件夹,复制粘贴,剪切功能的实现,读写文件,对象的序列化与反序列化等

m0_48895748的博客 798

【2022网易雷火】游戏研发笔试-AC代码及题目分享

3个小时,4道题目,雷火的题目不在于难,更在于对细节的把控和写大模拟的耐心,花了一个半小时,AC了3.85,直接交卷退了。第一题AC,第二题AC,第三题85%,第四题AC。下面分享一下大致的题意和对应的代码,就不多说了,最近很累(代码可能会有贴错的情况,如有望指正,感谢~)。 T1-小Y抽奖 题意 n行m列个奖励格子,每次抽奖消耗一个道具。每个格子奖励的数量有限且各不相司。每个格子被抽到一次,剩余的奖励数量-1。剩余的奖励数量为0时,则不会再抽到该格子。小Y抽了好多次,但一直没有抽到最想要的..

米莱虾 9265

Java IO流 序列化和反序列化

序列化 Java InputStream和OutputStream ObjectInputStream/ObjectOutputStream 上传下载序列化文件

morphhy的博客 944

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Java】Java中的IO流概念Java 中 IO 流分为几种?BIO、NIO、AIO,Object 有哪些方法?获取类Class对象的方式?序列化和反序列化?

AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出CloneNotSupportedException 异常,深拷贝也需要实现 Cloneable,如果其成员变量为引用类型的也需要实现 Cloneable,然后重写 clone 方法。该方法使用频率非常高。中的某个线程(同步队列中的线程是给抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)。

2301_79456272的博客 1720

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java IO流-输入输出、序列化与反序列化、标准输入输出、打印流等

文章目录1. 数据输入输出流2. 内存操作流3. 打印流4. 标准输入输出流5. 随机访问流6. 序列化流与反序列化流7. Properties集合8. SequenceInputStream9. 压缩流与解压流 1. 数据输入输出流 概述 用来对Java中的基本数据类型进行操作 可以写基本数据类型,也可以读基本数据类型 分类 数据输入流 DataInputStream 数据输...

qq_44495081的博客 497

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java_IO流(二十五)—— Properties类、序列化流与反序列化流、打印流、 commons-IO

第一章Properties类 1.1Properties类介绍 Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 特点: 1、Hashtable的子类,map集合中的方法都可以用。 2、该集合没有泛型。键值都是字符串。 3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。 4、有和流技术相结合的方法。 loa...

qq_40243295的博客 309

Java--IO流;File类;文件、目录拷贝;序列化与反序列化;Properties

一、IO流 IO流用来处理设备之间的数据传输 数据传输是需要通道的,而IO流就是数据传输的通道;因此IO流可以形象的比喻为运送货物的传输带 I : Input O : Output 通过IO可以完成硬盘文件的读和写 二、流分类 1、按流向 输入流 和 输出流 以内存作为参照物, 从外部读取到内存中,叫做输入(Input),读(Read)到内存;如:InputStream 从内存中读取出来,叫做输出(Output),写(Write)进硬盘;如:OutputStream 2、按操作的数据类

MinggeQingchun的博客 585

java——序列化的反序列化 和 IO 流 和 单例模式下将信息存储到properties文件中

1.序列化反序列化 为什么要序列化? 因为在保存一个对象或者大型数据类型时,因为平台的不同(比如操作系统不同),需要通过网络传递时,需要适应对方的环境或者网络的协议,要将对象的数据转化成一种标准的字节流序列,从而能在其他平台还原出来和符合网络传输的要求。 所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。 序列化:把Java对象转换为字节序列的过程。序列化之后...

dts_121526的博客 226

【Java学习|黑马笔记|Day21】IO流|缓冲流,转换流,序列化流,反序列化流,打印流,解压缩流,常用工具包相关用法及练习

本文分享了Java IO流中缓冲流,序列化流,打印流,解压缩流,常用工具包相关应用和练习

2401_87144364的博客 1053

从0开始学java-day25:IO流-Properties集合、序列化流与反序列化流、打印流、commons-IO

今日内容介绍1、Properties集合2、序列化流与反序列化流3、打印流4、commons-IO 01Properties集合的特点 * A: Properties集合的特点 * a: Properties类介绍 * Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串 * b: 特点 * Hashtable的子类,map集合中的方法都可以用。 * 该集

weixin_48583602的博客 209

java io序列流_javaIO流-(十)对象流、序列化与反序列化

一、相关内容二、IO流体系IO流体系三、对象流:处理流的一种ObjectInputStream和OjbectOutputSteam用于存储和读取基本数据类型数据或对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来序列化:用ObjectOutputStream类保存基本类型数据或对象的机制反序列化:用ObjectInputStream类读取基本类型数据或...

weixin_28340315的博客 133

Java—Reader,Writer,InputStream,OutputStream,缓冲IO流,转换流,数据IO流,序列化与反序列化,try...catch

IO 概述 (1)如果对于File对象来说,输入输出流只能针对文件,不能针对目录 (2)IO操作不仅仅是针对文件,还可以从网络中输入输出 (3)输入输出的参照物是当前程序 IO的分类 (1)按方向 输入流(InputStream):将数据从某个源流向程序中 输出流(OutputStream):将数据从程序往外发送到某个目的地 (2)按操作数据的单位 字节流:适用于任何类型的文件,但如果是纯文本文件用字符流更快 字符流:只能用于读/写纯文本数据(内容全部是字符),纯文本文件:.txt,.html,.xml,

shiranjiu的博客 231

Java IO流之序列化和反序列化

为什么要进行序列化和反序列化? 当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个Java进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要Java序列化与反序列化了。换句话说,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中...

qq_34848299的博客 188

Java-IO流之序列化与反序列化详解

Java中对象的序列化(Serialization)与反序列化(Deserialization)是一项重要技术,为对象的持久化和远程传输提供了基础支持,它允许将对象转换为字节流以便存储或传输,也可以将字节流还原为原始对象。这项技术在分布式系统、远程方法调用(RMI)、缓存机制等场景中有着广泛的应用。本文我将深入探讨Java序列化与反序列化的原理、实现方法及最佳实践,带你全面掌握这一核心技术

aa_hdkf_vg的博客 1107

Java基础day14:IO流:转换流、打印流、合并流、反序列化

静态成员不能被序列化transient修饰的成员会被忽略被Serializable接口修饰的类在被编译为.class时会被标记一个独一无二的serialVersionUID, 利用这个id在反序列化时进行检查,保证只有完全一致的类才能反序列化,从而保证安全性。我们也可以自己定义serialVersionUID,从而自己控制序列化和反序列化的安全检查,实现, 在类只有轻微改动的情况下,仍然可以实现反序列化的功能。

weixin_62189092的博客 709
上一篇: 线程之间的通信之消费者与生产者
madi_Goly
博客等级 码龄16年 11粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值