序列化流和反序列化流

news2024/12/23 14:27:18

序列化流

ObjectOutputStream 序列化流/对象操作输出流

包装基本流,属于字节流的一种,负责输出数据。可以把Java中的对象写到本地文件中去。

构造方法:

public ObjectOutputStream(OutputStream out)把基本流包装成高级流

成员方法:

public final void writeObject(Object obj)把对象序列化(写出)到文件中去

序列化流的小细节:使用对象输出流将对象保存到文件时会出现NotSerializableException异常

解决方案:需要让Javabean类实现Serializable接口。Serializable接口里面是没有抽象方法,是标记型接口,一旦实现了这个接口,那么就表示当前的Javabean类可以被序列化。

public class ObjectStreamDemo1 {
    public static void main(String[] args) throws IOException {
        /*
           需求:
                利用序列化流/对象操作输出流,把一个对象写到本地文件中

           构造方法:
                public ObjectOutputStream(OutputStream out)         把基本流变成高级流

           成员方法:
                public final void writeObject(Object obj)           把对象序列化(写出)到文件中去

        */
        //1.创建对象
        Student stu = new Student("zhangsan",23);
        //2.创建序列化流的对象/对象操作输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myio\\a.txt"));
        //3.写出数据
        oos.writeObject(stu);
        //4.释放资源
        oos.close();
    }
}

Javabean类:

/*
*
* Serializable接口里面是没有抽象方法,标记型接口
* 一旦实现了这个接口,那么就表示当前的Student类可以被序列化
* 理解:
*       一个物品的合格证
* */
public class Student implements Serializable {
    private String name;
    private int age;


    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

反序列化流

ObjectInputStream 反序列化流/对象操作输入流

可以把序列化到本地文件中的对象,读取到程序中来。

构造方法:

public ObjectInputStream(InputStream out)把基本流变成高级流

public Object readObject()把序列化到本地文件中的对象,读取到程序中来

public class ObjectStreamDemo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        /*
           需求:
                利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中
           构造方法:
                public ObjectInputStream(InputStream out)         把基本流变成高级流
           成员方法:
                public Object readObject()                        把序列化到本地文件中的对象,读取到程序中来
        */

        //1.创建反序列化流的对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("myio\\a.txt"));
        //2.读取数据
//        Object o = ois.readObject();
        Student o = (Student) ois.readObject();
        //3.打印对象
        System.out.println(o);
        //4.释放资源
        ois.close();
    }
}

序列化流/反序列化流的细节汇总

1、使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常。

2、序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了。

3、序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?

会,报InvalidClassException异常,因为文件中的版本号,跟Javabean中的版本号不匹配。

解决方法:给Javabean类添加 serialVersionUID(序列号、版本号)

方法1:手动添加

private static final long serialVersionUID=1L;

方法2:idea设置以下选项  

可以自动生成版本号,点击类名Alt+Enter选择以下选项

4、如果一个对象中的某个成员变量的值不想被序列化,如何实现?

解决方案:

给该成员变量加 transient 瞬态关键字修饰,该关键字标记的成员变量不参与序列化过程

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

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

相关文章

【Java 并发编程】解决多线程中数据错乱问题

前言 承接上回,我们已经理解了线程的一些相关操作,本篇内容将会讲到如何去解决线程竞争导致的数据错乱。 前期回顾:线程操作 目录 前言 线程竞争的场景 竞态条件的详解 synchronized 关键字 ReentrantLock 类 线程竞争的场景 概念&#xff1a…

异步场景: promise、async函数与await命令介绍

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 在鸿蒙的开发中,我们时常会遇到promise异步场景,有同学反馈说…

Adobe Acrobat Pro和Adobe Acrobat DC有什么区别?

主要区别 Adobe Acrobat Pro: 以单次购买的方式提供,用户需要一次性付费购买,之后即可永久使用该版本。不会频繁更新,通常只在发行新版本时进行更新。 Adobe Acrobat DC: 以订阅方式提供,用户需要每年支付…

《2024 国庆旅游数据洞察:活力与新趋势》

《2024 国庆旅游数据洞察:活力与新趋势》 一、国庆旅游市场整体态势 今年国庆假期,旅游市场的火爆程度令人瞩目。从出行人次来看,嘀嗒出行的国庆顺风出行预测显示,顺风出发高峰日预计为 9 月 29 日,环比 9 月出行峰值…

在Ubuntu 22.04上安装Ollama的两种方式

curl 安装 参考Linux上安装Ollama的官方文档:https://ollama.com/download/linux 在终端执行以下命令即可: curl -fsSL https://ollama.com/install.sh | shdocker 安装 官方 Ollama Docker 镜像可以直接在Docker Hub上进行拉取。 Docker Hub上的ol…

Java 方法的重载

1.重载:在一个类中,方法的函数名相同,但形参不同。 结果: 2.方法重载的规则: (1)方法名必须相同。(例如:重名的人有很多) (2&#x…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(二).设置主键自增等特点

前言 在上一节中,主要介绍了 Navicat Premium 17 的使用以及创建一个基础的表格。当时只设置了给数据表补充字段,没有设置给数据表删除字段。现在补充一下。 ALTER TABLE student ADD test int(4); 给名为 student 的数据表添加 test 列&#xf…

正则表达式-“三剑客”(grep、sed、awk)

1.3正则表达式 正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个串中取出符号某个条件的子串等,在linux中代表自定义的模式模版,linux工具可以用正则表达式过滤文本。Linux…

vavr Java的函数式编程神器-Part1

微信公众号:阿俊的学习记录空间 小红书:ArnoZhang wordpress:arnozhang1994 博客园:arnozhang CSDN:ArnoZhang1994 1. 介绍 Vavr(前称 Javaslang)是一个为 Java 8 提供的函数式库,…

红外探测算法!!!

一、红外探测的基本原理 红外探测基于红外辐射与物体的热状态之间的关系。物体温度越高,辐射能量越大。红外探测器通过接收物体发出的红外辐射,将其转换为电信号,进而实现对目标的探测和识别。 二、红外探测算法的主要类型 背景差分法&…

[自然语言处理]RNN

1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(8)def dm01():参数1:输入向量的维数参数2:隐藏层神经元的个数参数3:隐藏层的层数:return:rnn nn.RNN(5, 6, 1)参数1:句子长度sequence_length参数2&am…

九芯电子NVH/NVF语音芯片OTA升级操作方法

OTA(Over-The-Air)升级是指通过无线网络远程对设备进行软件升级的过程。对于九芯电子NVH/NVF语音芯片,OTA升级可以通过WiFi模组实现,支持MQTT、HTTP等协议,方便快捷‌。 具体操作步骤如下: 1.进入九芯“智…

计算机毕业设计 基于Django的学生选课系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优 在进行压力测试时,遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…

重头开始嵌入式第四十七天(硬件 ARM裸机开发 RS232 RS4885 IIC)

目录 一.什么是RS232? 1. 历史背景: 2. 电气特性: 3. 连接器类型: 4. 通信特点: 5. 应用场景: 二.什么是RS485? 1. 电气特性: 2. 通信模式: 3. 传输距离与速率&…

技术路线图用什么画?用这个在线工具轻松完成绘制!

在当今快速发展的技术世界中,技术路线图已成为企业和团队不可或缺的战略规划工具。它不仅能够清晰地展示技术发展方向,还能帮助团队成员、利益相关者和投资者更好地理解和参与技术战略的制定过程。但不可否认的是,创建一个有效的技术路线图并…

如何免费为域名申请一个企业邮箱

背景 做SEO的是有老是会有一些网站来做验证你的所有权,这个时候,如果你域名对应的企业邮箱就会很方便。zoho为了引导付费,有很多多余的步骤引导,反倒是让不付费的用户有些迷茫,所以会写这个教程,按照教程走…

虚幻引擎GAS入门学习笔记(二)

虚幻引擎GAS入门(二) 学习位置UE5.3 GAS入门教程重置版 小明 MVC框架与技能初始化 让一开始创建的蓝图的基础GameplayAbility蓝图继承我们写好的BaseGameplayAbility类 创建一个库函数,写一些常用的函数在里面第一个得到玩家与玩家控制器 获取角色面对目标的方向…

c++11~c++20 thread_local

线程局部存储是指对象内存在线程开始后分配,线程结束时回收且每个线程有该对象自己的实例,简单地说,线程局部存储的对象都是独立各个线程的。实际上这并不是一个新鲜个概念,虽然C一直没因在语言层面支持它,但是很早之前…

Coggle数据科学 | 全球AI攻防挑战赛:金融场景凭证篡改检测 baseline

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:全球AI攻防挑战赛:金融场景凭证篡改检测 baseline 赛题名称:全球AI攻防挑战赛—赛道二(AI核身-金融场景凭证篡改…