一文了解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"…...
Gitee Scan:关键领域软件工厂的安全检测能力分析
Gitee Scan:关键领域软件工厂的安全检测能力分析 文章概述 软件供应链安全正成为互联网、金融、国防等关键领域关注的焦点。Gitee Scan 是 Gitee DevSecOps 平台中集成的安全检测组件,提供 SAST(静态应用安全测试)、SBOMÿ…...
ElevenLabs瑞典文语音生成延迟超800ms?独家逆向分析其WebRTC音频缓冲机制,给出3行代码级低延迟注入方案
更多请点击: https://codechina.net 第一章:ElevenLabs瑞典文语音生成延迟超800ms?独家逆向分析其WebRTC音频缓冲机制,给出3行代码级低延迟注入方案 ElevenLabs 在瑞典语(sv-SE)TTS 服务中默认启用高保真音…...
Unity原生依赖管理:EDM4U原理、避坑与CI/CD工程化实践
1. 为什么Unity项目越来越离不开EDM4U:从“手动拖拽”到“依赖即代码”的真实痛感我第一次在2019年接手一个中型AR项目时,团队还在用最原始的方式管理第三方库:把.dll、.asmdef、Plugins/Android目录下的.aar文件,甚至Unity Packa…...
8255与74LS273实现流水灯控制原理
箱图片和题目要求,这是一个经典的微机原理/接口技术实验。你需要构建一个包含输入(开关)、处理(8255读取)、输出(74LS273锁存驱动LED)的系统。由于我无法直接为你绘制CAD图纸,我为你…...
AI原生组织:从「加AI功能」到「长AI基因」,大企业实践与中小团队轻量思路揭秘
AI原生组织:从「加AI功能」到「长AI基因」的本质跃迁与落地路径AI原生组织并非给传统企业贴AI膏药,而是围绕人机协同重新设计业务逻辑、组织架构和激励机制。下面从认知误区切入,结合阿里、华为、传神等企业案例,拆解AI原生组织的…...
美国签证预约神器:3步告别熬夜抢号,智能锁定更早面试时间
美国签证预约神器:3步告别熬夜抢号,智能锁定更早面试时间 【免费下载链接】us-visa-bot US Visa Bot 项目地址: https://gitcode.com/gh_mirrors/us/us-visa-bot 还在为美国签证预约的漫长等待而焦虑吗?每天手动刷新页面却总是错过最佳…...
Agent_Skills_万千应用_第01篇_PDF 处理 Skill:让 Agent 真正会读、会拆、会抽取 PDF
Agent Skills 万千应用 第01篇 PDF 处理 Skill:让 Agent 真正会读、会拆、会抽取 PDF 01|场景痛点开场:PDF 是办公室里最像“黑盒”的文件 你一定遇到过这种场景:老板丢来一份 80 页行业报告,让你 10 分钟内说清楚“…...
在骁龙 X2 Elite 上安装 Hermes Agent(1): 硬件规格和安装准备
系列导读 为什么 骁龙Snapdragon X2 Elite 是 Hermes Agent 的最佳搭档?本文是《在骁龙 X2 Elite 上安装 Hermes Agent》系列的第一篇。你将了解 骁龙 X2 Elite 的强大硬件规格、Hermes Agent 的核心能力,以及安装前的准备工作。 一、为什么选择骁龙 X2 …...
SVN 报错 Previous operation has not finished,提示需要 clean up
SVN报错"Previous operation has not finished"通常是由于操作中断导致工作副本被锁定。 解决方法按优先级推荐: 1)首选执行Cleanup操作,勾选"Cleanup working copy status"和"Break write locks";…...
Box64终极指南:如何在ARM设备上轻松运行x86程序?三个简单步骤解锁无限可能
Box64终极指南:如何在ARM设备上轻松运行x86程序?三个简单步骤解锁无限可能 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_m…...
