一文了解Java序列化
Java 序列化(Serialization)是将对象的状态转换为字节流,以便将对象的状态保存到文件中或通过网络传输的过程。反序列化(Deserialization)则是将字节流恢复为原始对象。Java 序列化主要通过 Serializable 接口实现。

为什么需要序列化?
- 持久化:将对象状态保存到硬盘(例如文件或数据库)以便以后恢复。
- 传输:通过网络传输对象,适用于分布式系统。
- 缓存:对象序列化后可被缓存,从而避免重复构建对象。
- 远程调用:远程方法调用(RMI)等技术中使用序列化传输对象。
如何实现序列化?
1. 实现 Serializable 接口
要实现序列化的类必须实现 java.io.Serializable 接口。这个接口没有任何方法,称为“标记接口”,表示该类的对象可以被序列化。
import java.io.Serializable;public class Person implements Serializable {private static final long serialVersionUID = 1L; // 序列化版本IDprivate String name;private int age;// 构造函数和其他方法...
}
2. ObjectOutputStream 和 ObjectInputStream
- 序列化:使用 ObjectOutputStream 将对象写入文件或网络。
- 反序列化:使用 ObjectInputStream 从字节流中恢复对象。
序列化对象
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;public class SerializationExample {public static void main(String[] args) {Person person = new Person("Alice", 30);try (FileOutputStream fileOut = new FileOutputStream("person.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut)) {out.writeObject(person);System.out.println("Object serialized to person.ser");} catch (IOException e) {e.printStackTrace();}}
}
反序列化对象
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;public class DeserializationExample {public static void main(String[] args) {try (FileInputStream fileIn = new FileInputStream("person.ser");ObjectInputStream in = new ObjectInputStream(fileIn)) {Person person = (Person) in.readObject();System.out.println("Deserialized Person: " + person.getName() + ", " + person.getAge());} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
serialVersionUID 的作用
serialVersionUID 是序列化版本控制 ID,用于验证序列化和反序列化过程中的兼容性。修改类结构后,旧的序列化对象可能无法反序列化,除非定义相同的 serialVersionUID。
private static final long serialVersionUID = 1L;
- 如果未指定 serialVersionUID,Java 会自动生成一个,但不稳定,建议手动定义。
- 若类的版本变化(如添加字段),反序列化时版本不匹配会抛出 InvalidClassException。
transient 关键字
用 transient 修饰的字段在序列化时会被忽略,不会被写入字节流。
public class Person implements Serializable {private String name;private transient int age; // 不会被序列化
}
Externalizable 接口
Externalizable 是 Serializable 的替代接口,提供更高的控制性。实现 Externalizable 后,必须重写 writeExternal 和 readExternal 方法。
import java.io.Externalizable;
import java.io.ObjectOutput;
import java.io.ObjectInput;
import java.io.IOException;public class Person implements Externalizable {private String name;private int age;@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeObject(name);out.writeInt(age);}@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {name = (String) in.readObject();age = in.readInt();}
}
注意事项
- 对象的所有字段也必须是可序列化的,否则会抛出 NotSerializableException。
- 安全性:在反序列化时可能存在安全风险,反序列化恶意数据可能会导致漏洞。
- 性能:序列化和反序列化比较耗时,尤其是深层嵌套对象或包含大量字段的类。
相关文章:
一文了解Java序列化
Java 序列化(Serialization)是将对象的状态转换为字节流,以便将对象的状态保存到文件中或通过网络传输的过程。反序列化(Deserialization)则是将字节流恢复为原始对象。Java 序列化主要通过 Serializable 接口实现。 为…...
【前端基础】CSS基础
目标:掌握 CSS 属性基本写法,能够使用文字相关属性美化文章页。 01-CSS初体验 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容&#…...
Linux之selinux和防火墙
selinux(强化的linux) 传统的文件权限与账号的关系:自主访问控制,DAC; 以策略规则制定特定程序读取特定文件:强制访问控制,MAC SELinux是通过MAC的方式来控制管理进程,它控制的主…...
架构零散知识点
1 数据库 1.1 数据库范式 有一个学生表,主键是学号,含有学生号、学生名、班级、班级名,违反了数据库第几范式? --非主属性不依赖于主键,不满足第二范式 有一个订单表,包含以下字段:订单ID&…...
【从零开始的LeetCode-算法】3254. 长度为 K 的子数组的能量值 I
给你一个长度为 n 的整数数组 nums 和一个正整数 k 。一个数组的 能量值 定义为: 如果 所有 元素都是依次 连续 且 上升 的,那么能量值为 最大 的元素。否则为 -1 。 你需要求出 nums 中所有长度为 k 的子数组的能量值。 请你返回一个长度为 n - k 1…...
跨IDE开发
跨IDE开发:多工具协同最佳实践 🛠️ 在现代软件开发中,不同的开发任务往往需要不同的工具。让我们探讨如何高效地在多个IDE间协同工作! 第一部分:IDE协同开发的基础设施 🏗️ 1. 统一的项目配置 为了确保…...
2020年美国总统大选数据分析与模型预测
数据集取自:2020年🇺🇸🇺🇸美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析,提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理࿰…...
C++应用场景开发——学生信息管理系统!!!
C 是一种多功能且高效的编程语言,广泛应用于多种领域。 以下是一些常见的 C 应用场景: 1. 系统软件开发 C 经常用于开发操作系统、文件系统、设备驱动程序和其他底层系统软件。由于其高效的内存管理和性能优势,C 在这些领域非常受欢迎。 …...
Pytorch实现transformer语言模型
转载自:| 03_language_model/02_Transformer语言模型.ipynb | 从头训练Transformer语言模型 |Open In Colab | Transformer语言模型 本节训练一个 sequence-to-sequence 模型,使用pytorch的 nn.Transformer <https://pytorch.org/docs/master/nn.ht…...
Java后台生成指定路径下创建指定名称的文件
1.Java后台生成指定路径下创建指定名称的CSV文件 /*** <生成csv文件>* param filePath 文件路径名称* param fileName 文件名称* param colNameList 标题数据信息* param dataList CSV的文件数据* return filePathfileName* throws*/public static File genera…...
sqlcoder70b模型,如果需要训练或者微调需要什么样的GPU机器
要训练或微调 SQLCoder-70B 这样的大规模模型,需要高性能 GPU 资源。以下是硬件资源的推荐配置,特别是针对内存需求较大的模型: 1. GPU 显存要求 至少 8 张 A100 80GB GPUs:70B 参数模型在微调时需要高显存,80GB A10…...
【Python实战案例】爬虫项目实例(附赠源码)
文章目录 声明安装必要的库项目结构技术细节小结 声明 请您遵守网站的robots文件规定,本文目的只是做学习交流使用,包括多个模块,例如数据存储、日志记录、错误处理、多线程或异步请求 安装必要的库 pip install requests beautifulsoup4 sq…...
PDF多功能工具箱 PDF Shaper v14.6
如今对PDF处理的软件很多都是只是单一的功能。PDF Shaper给你完全不同的体验,因为PDF Shaper是一款免费的PDF工具集合的软件。有了PDF Shaper,你以后再也不用下载其他处理PDF的软件了。PDF Shaper的功能有:合并,分割,加…...
Jupyter Notebook添加kernel的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
Linux 无名管道
无名管道(unnamed pipe)是一种进程间通信的方式,通常用于父子进程之间的通信。下面是使用无名管道的基本步骤: pipe 调用的返回值如下: 成功时:pipe 调用成功时返回 0。失败时:如果 pipe 调用…...
Java项目实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着医疗行业的快速发展和人们对健康需…...
前端拖拽库方案之react-beautiful-dnd
近期,知名 React 拖拽库 react-beautiful-dnd 宣布了项目弃用的决定,未来将不再维护。这一决定源于其存在的缺陷与局限性,促使作者转向开发一个更加现代化的拖拽解决方案——Pragmatic drag and drop(下面会介绍)&…...
【题解】CF2033G
题目 CF2033G 分析 一道很显然是树形dp的题,但非常恶心QwQ。 先不管复杂度,找找递推关系,一种很直接的想法如下(我觉得是错误的): d p [ i ] [ k ] m a x ( d p [ f a i ] [ k − 1 ] , d p [ s o …...
【error】 react 控制台报错Invalid hook call
目录 事件起因解决办法结束语 事件起因 我的前端react ant-design-pro项目能正常启动 但是网页这边就是一片空白,然后在浏览器的控制台报错: index.js:1 Warning: Invalid hook call. Hooks can only be called inside of the body of a function co…...
SDL基本使用
#include <stdio.h>#include <SDL.h>#undef main int main() {printf("Hello World!\n");SDL_Window *window NULL; // 声明窗口SDL_Init(SDL_INIT_VIDEO); // 初始化SDL// 创建SDL Windowwindow SDL_CreateWindow("Basic Window"…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
