一文了解Java序列化和反序列化:对象的存储与传输
一文了解Java序列化和反序列化:对象的存储与传输
作者:Stevedash
发布时间:2023年8月9日 21点30分
前言
Java序列化是一项强大而重要的技术,它允许我们将对象转换为字节流,以便在存储、传输和重建时使用。在本文中,我们将深入探讨Java序列化的基本概念、使用方法以及一些应用场景。

基本概念:什么是Java序列化?
Java序列化是指将对象转换为字节流的过程,以便可以将其存储到文件、数据库或在网络上传输,并在需要时重新构建对象。序列化是Java的一个核心特性,它允许我们保存对象的状态并在需要时还原它们,从而实现持久化和数据交换。
如何进行Java序列化?
要进行Java序列化,首先需要确保被序列化的类实现了java.io.Serializable接口。这是一个标记接口,没有定义任何方法,只是用来标识该类可以进行序列化。接下来,我们可以使用ObjectOutputStream类将对象序列化为字节流,或使用ObjectInputStream类将字节流反序列化为对象。
下面是一个简单的示例:
import java.io.*;public class SerializationExample {public static void main(String[] args) {// 创建一个要序列化的对象Student student = new Student("Alice", 20, "CS");try {// 创建文件输出流,将对象序列化到文件FileOutputStream fileOut = new FileOutputStream("student.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(student); // 将对象写入输出流out.close(); // 关闭输出流fileOut.close(); // 关闭文件输出流System.out.println("对象已序列化");} catch (IOException e) {e.printStackTrace();}try {// 创建文件输入流,将文件中的字节流反序列化为对象FileInputStream fileIn = new FileInputStream("student.ser");ObjectInputStream in = new ObjectInputStream(fileIn);Student deserializedStudent = (Student) in.readObject(); // 从输入流中读取对象in.close(); // 关闭输入流fileIn.close(); // 关闭文件输入流System.out.println("对象已反序列化");System.out.println("姓名:" + deserializedStudent.getName());System.out.println("年龄:" + deserializedStudent.getAge());System.out.println("专业:" + deserializedStudent.getMajor());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}class Student implements Serializable {private String name; // 学生姓名private int age; // 学生年龄private String major; // 学生专业// 构造方法,初始化学生信息public Student(String name, int age, String major) {this.name = name;this.age = age;this.major = major;}// 省略 getter 和 setter 方法
}
在上述示例中,我们首先创建一个Student类并实现了Serializable接口。然后,我们将一个Student对象序列化到文件student.ser中,再从文件中反序列化出一个新的Student对象。
序列化的应用场景
Java序列化在很多场景中都有用武之地,包括但不限于以下几个方面:
-
对象的持久化存储: 序列化允许我们将对象保存在文件或数据库中,以便在程序重新运行时恢复对象的状态。
-
网络传输: 序列化可以将对象转换为字节流,便于在网络上进行传输,例如在客户端和服务器之间交换数据。
-
缓存: 序列化可以用于将对象存储在缓存中,以提高数据的访问速度。
Java序列化的优点和缺点
优点:
-
持久化存储: Java序列化允许对象在存储时保持其状态,以便在程序重新启动后恢复。
-
跨平台传输: 序列化可以将对象转换为字节流,在不同的平台之间传输,无需担心不同的数据格式问题。
-
对象复制: 序列化可以用于创建对象的副本,无需手动复制每个属性。
缺点:
-
性能开销: 序列化过程需要将对象转换为字节流,涉及到大量的IO操作,可能对性能产生一定影响。
-
版本兼容性: 如果类的结构发生变化,反序列化可能会出现问题,需要特殊处理版本兼容性。
序列化的条件和注意事项
要进行Java序列化,需要注意以下条件和事项:
-
被序列化的类必须实现
java.io.Serializable接口。 -
静态变量不会被序列化,因为它们属于类而不是对象。
-
序列化并不保存类的方法,只保存对象的状态。
-
被序列化的类中如果包含了对其他对象的引用,这些引用的对象也必须是可序列化的。
-
在版本兼容性方面,当类的结构发生变化时,需要使用
serialVersionUID来确保反序列化过程的正确性。
什么是反序列化?
反序列化是将字节流转换回对象的过程,即将序列化后的字节流重新构建为对象。通过反序列化,我们可以将之前序列化的对象重新还原成原来的状态,从而实现数据的恢复和重建。
序列化和反序列化的区别
序列化和反序列化是两个相互关联的过程,它们分别实现了对象的存储和重建。序列化将对象转换为字节流以便存储和传输,而反序列化则
将字节流重新还原为对象,从而实现数据的恢复。这两个过程在Java中都是重要且常用的操作,它们一起构成了对象持久化和数据交换的基础。
总结
Java序列化是一项强大的技术,允许我们将对象转换为字节流以进行存储、传输和重建。通过实现Serializable接口,并使用ObjectOutputStream和ObjectInputStream,我们可以轻松地实现对象的序列化和反序列化。在适当的场景下,序列化可以提供持久化、数据交换和缓存等多种好处。但要注意条件和版本兼容性,以确保序列化和反序列化的正确性。
希望本文对你理解Java序列化提供了一些帮助。
作者:Stevedash
发表于:2023年8月9日21点30分
来源:Java 序列化 | 菜鸟教程 (runoob.com)
注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。
相关文章:
一文了解Java序列化和反序列化:对象的存储与传输
一文了解Java序列化和反序列化:对象的存储与传输 作者:Stevedash 发布时间:2023年8月9日 21点30分 前言 Java序列化是一项强大而重要的技术,它允许我们将对象转换为字节流,以便在存储、传输和重建时使用。在本文中&…...
react-codemirror2 编辑器需点击一下或者延时才显示数据的问题
现象: <Codemirror/>组件的数据已经赋上值的情况下,初始状态不渲染数据,需要点击编辑框获取焦点后才展示,或者延迟了几秒才显示出来。 原因: 指定了一些依赖的版本,可能不兼容了一些功能,…...
火山引擎联合Forrester发布《中国云原生安全市场现状及趋势白皮书》,赋能企业构建云原生安全体系
国际权威研究咨询公司Forrester 预测,2023年全球超过40%的企业将会采用云原生优先战略。然而,云原生在改变企业上云及构建新一代基础设施的同时,也带来了一系列的新问题,针对涵盖云原生应用、容器、镜像、编排系统平台以及基础设施…...
需要数电发票接口的,先熟悉下数电发票基本常识
最近有一些技术小伙伴来咨询数电发票接口的时候,对数电发票的一些常识不太了解, 导致沟通起来比较困难。比较典型的这三个问题: 一、开具数电票时,如何设置身份认证频次? 请公司的法定代表人或财务负责人登录江苏省电…...
node-sass是什么
一、Sass(Syntactically Awesome Style Sheets) 是一种CSS预处理器,它扩展了CSS的功能并提供了更强大的样式表语言。Sass允许开发人员使用变量、嵌套规则、混合(Mixins)、继承等高级功能来编写更简洁、可维护的样式代…...
C语言指针之 进阶
前言 今天来较为深入的介绍一下指针,希望大家能有所收获~ 那么,先进行一些简单的基础知识复习吧。 字符指针 格式:char * 补充: 表达式“abcdef”的值是首字符a的地址 所以当像下面这么使用时,它的含…...
C++单例模式
文章目录 1、什么是单例2、一个好的单例应该具备的条件3、懒汉模式与饿汉模式4、单例实现:线程安全、内存安全的懒汉式单例(基于C11的智能指针和互斥锁) 1、什么是单例 单例 Singleton 是设计模式的一种,其特点是只提供唯一一个类…...
C++ 析构函数
析构函数 析构函数于构造函数相对应,构造函数是对象创建的时候自动调用的,而析构函数就是对象在销毁的时候自动调用的 特点: 1)构造函数可以有多个来构成重载,但析构函数只能有一个,不能构成重载 2&…...
CSS——字体选择
在网页设计和开发中,字体选择是一个非常重要的因素。字体不仅仅是文字的表现形式,它们还能够传达出一种特定的情感和风格。在CSS中,我们可以通过使用字体代码来定义网页中使用的字体。 CSS提供了一种简单而灵活的方式来设置字体。通过使用fo…...
SpringBoot自动装配及run方法原理探究
自动装配 1、pom.xml spring-boot-dependencies:核心依赖在父工程中!我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就因为有这些版本仓库 1.1 其中它主要是依赖一个父工程,作用是管理项目的资源过滤及…...
Mybatis实现JsonObject对象与JSON之间交互
项目中使用PostGresql数据库进行数据存储,表中某字段为Json类型,用于存储Json格式数据。PG数据库能够直接存储Json算是一大特色,很多特定情境下使用直接存储Json字段数据能够大量节省开发时间,提高后台数据查询和转换效率。 1、基…...
spring boot 集成 jetcache【基础篇:@Cached、@CreateCache、@CacheRefresh】
手打不易,如果转摘,请注明出处! 注明原文:https://zhangxiaofan.blog.csdn.net/article/details/129832925 目录 前言 版本 配置通用说明 项目结构 代码 启动类 实体类 基础使用——增删改查(Cached、CacheInv…...
个人对前后端分离的一些看法
内容简介:前端开发过程中能完全不依赖后端的才是真正的前后端分离指的是工作过程中,前端的的代码中往往会掺杂一些后端的逻辑。后端返回了一个json对象 前端开发过程中能完全不依赖后端的才是真正的前后端分离 指的是工作过程中,前端的的代码…...
TailWindCss 在Hbuilderx中使用
基于这个插件 weapp-tailwindcss 地址 本次说明基于HbuilderX 创建的项目非CLI 安装步骤按照文档走,先安装上几个依赖。然后是几个配置文件 tailwind-input.css tailwind的css文件用来引入到app.vue /* #ifdef H5 */ tailwind base; /* 如果是小程序的话&#x…...
Unity导入图片时,通过设置属性快速实现资源的压缩
是在学习tilemap绘制世界地图的时候发现的这个功能。 之前一直只是粗略的知道这部分是对应图片资源的压缩的。比如Compression是指的压缩质量,想要完全不压缩就设置None,会导致图片资源会大一些。 在我的例子工程中,其他图片资源的尺寸都是6…...
AlmaLinux 9 安装 Go 1.20
AlmaLinux 9 安装 Golang 1.20 1. 下载 go 安装包2. 安装 go3. 配置环境变量4. 确认 go 版本 1. 下载 go 安装包 访问 https://go.dev/dl/,下载你想安装的版本,比如 go1.20.7.linux-amd64.tar.gz, 2. 安装 go (可选)删除旧版本,…...
【Docker】数据库动态授权组件在Kubernetes集群下的测试过程记录
目录 背景 组件原理 测试设计 环境 测试脚本 脚本build为linux可执行文件 镜像构建 Dockerfile Docker build 镜像有效性验证 总结 资料获取方法 背景 我们都知道出于安全性考虑,生产环境的权限一般都是要做最小化控制,尤其是数据库的操作授…...
数据结构【第3章】——线性表
线性表的定义 线性表:零个或多个数据元素的有限序列。 1)线性表是一个序列。即元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。 2&a…...
MySql之分库分表
数据库瓶颈 不管是IO瓶颈还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值。在业务service来看, 就是可用数据库连接少甚至无连接可用,接下来就可以想象了(并发量、吞…...
数据结构—图的遍历
6.3图的遍历 遍历定义: 从已给的连通图中某一顶点出发,沿着一些边访问遍历图中所有的顶点,且使每个顶点仅被访问一次,就叫作图的遍历,它是图的基本运算。 遍历实质:找每个顶点的邻接点的过程。 图的…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
