一文了解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 接口

ExternalizableSerializable 的替代接口,提供更高的控制性。实现 Externalizable 后,必须重写 writeExternalreadExternal 方法。

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();}
}

注意事项

  1. 对象的所有字段也必须是可序列化的,否则会抛出 NotSerializableException。
  2. 安全性:在反序列化时可能存在安全风险,反序列化恶意数据可能会导致漏洞。
  3. 性能:序列化和反序列化比较耗时,尤其是深层嵌套对象或包含大量字段的类。

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

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

相关文章

斗破QT编程入门系列之前言:认识Qt:获取与安装(四星斗师)

本系列是在学习完C之后,然后通过Qt构建界面来,赋予枯燥的代码新的样貌,这样我们才能开发出更人性化的程序,同时会进一步提高初学者对编程的兴趣,大家加油,斗破Qt来了。 斗破Qt目录: 斗破Qt编程…

Spring Boot - 扩展点 EnvironmentPostProcessor源码分析及真实案例

文章目录 概述EnvironmentPostProcessor 作用EnvironmentPostProcessor 实现和注册创建类并实现接口注册到 Spring Boot常见应用场景 源码分析1. EnvironmentPostProcessor 接口定义2. 扩展点加载流程3. 加载 EnvironmentPostProcessor 实现类4. EnvironmentPostProcessor 执行…

封装的数字滚动组件的实现代码

效果: 学习啦: Vue 是一个渐进式框架,鼓励通过组件化来构建应用,其组件化优势: 代码复用:不同的视图和功能被封装成独立的组件,便于复用。易于维护:每个组件职责单一、耦合度低&…

Unity跨平台基本原理

目录 前言 ​编辑 Mono Unity和Mono的关系 Unity跨平台必备概念 Mono利用 Mono主要构成部分 基于Mono跨平台的优缺点 IL2CPP Mono和IL2CPP的区别 Mono IL2CPP Mono和IL2CPP的使用建议 安装IL2CPP IL2CPP打包存在的问题 类型裁剪 泛型问题 前言 Unity跨平台的基…

计算机网络(3)

UDP是面向无连接的通信协议,UDP数据包括目的端口号和源端口号信息,由于 不需要连接,所以可以实现广播发送; 传输控制层 UDP协议(用户数据报协议) UDP通信时不需要接收方确认,属于不可靠的传输&a…

2024年11月8日上海帆软用户大会

2024年11月8日上海帆软用户大会 2024年11月8日,上海成功举办了帆软用户大会,主题为“数字聚力,绽放新机”。大会汇聚了众多行业专家和企业代表,共同探讨数字化转型和商业智能领域的最新趋势和实践。 大会亮点: 专家…

PySimpleGUI和Pymysql

PySimpleGUI 库 PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件)&…

Qt Event事件系统小探1

目录 Qt Event System From qt.doc 如何传递事件 事件类型 事件处理程序 事件过滤器 发送事件 事件的产生和派发 处理我们的事件 来一段好玩的代码 扩展:QWidget如何处理我们的事件? 扩展2:实现一个变色的Label Qt Event System Fr…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于凸多面体仿射变换的用户侧灵活性资源多元聚合方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

vue3组合式API下封装hooks使用生命周期,在await之后调用hooks会有警告

起因:想封装一个hooks实现echarts图表随屏幕大小resize并且组件销毁时移除监听。结果在组件里面调用这个hooks,有个告警提示 [Vue warn]: onBeforeUnmount is called when there is no active component instance to be associated with. Lifecycle inje…

使用Python实现图像的手绘风格效果

使用Python实现图像的手绘风格效果 一、引言二、代码详细解释与示例三、完整框架流程四、运行五、结论附:完整代码 一、引言 在数字图像处理领域,模拟手绘风格是一项有趣且具有挑战性的任务。手绘风格图像通常具有独特的纹理和深浅变化,给人…

window中借助nginx配置vite+vue项目的反向代理步骤

在官网下载好nginx的安装包后,解压后 CMD打开 start nginx 是启动命令 nginx -s stop 停止服务 nginx -s reload 如果重写了nginx.conf文件,要执行这条命令 正常情况下 成功启动和成功停止服务长这样 错误情况&解决 如果nginx -s stop失败 ngi…

花指令例子

如图所示: 指令EB FF的汇编代码为jmp -1,CPU执行到地址处0x6c80c0的指令EB FF时(jmp -1),EIP为6c80c2, 执行后,EIP为0x6c80c1。但是反汇编器无法自动识别该指令。

关于我的编程语言——C/C++——第八篇

(叠甲:如有侵权请联系,内容都是自己学习的总结,一定不全面,仅当互相交流(轻点骂)我也只是站在巨人肩膀上的一个小卡拉米,已老实,求放过) 什么是C C语言是结…

博客园美化

1、主题介绍 使用的 SimpleMemory 这款主题 github官网 2、设置主题并申请 js 代码权限 3、主题设置 博客侧边栏公告 <script type"text/javascript">window.cnblogsConfig {info: {blogIcon: https://ts1.cn.mm.bing.net/th/id/R-C.85775e482741cb7ab7f…

SpringBoot基础系列学习(二):配置详解

文章目录 一丶依赖二丶配置文件三丶获取配置文件中的信息1.PropertySource("classpath:application2.properties")2. ConfigurationProperties(prefix "baicaizhi1")3. Value4. 使用EnviromentgBean获取5. 使用ResourceBundle获取 一丶依赖 <dependen…

初识Electron 进程通信

概述 Electron chromium nodejs native API&#xff0c;也就是将node环境和浏览器环境整合到了一起&#xff0c;这样就构成了桌面端&#xff08;chromium负责渲染、node负责操作系统API等&#xff09; 流程模型 预加载脚本&#xff1a;运行在浏览器环境下&#xff0c;但是…

建网站怎么建?只需几个步骤

在这个网络飞速发展的时代&#xff0c;越来越多的人都渴望拥有自己的网站。然而&#xff0c;对于大多数新手来说&#xff0c;如何建立自己的网站可能充满了挑战。本文将为您详细介绍建网站的关键步骤&#xff0c;让您能够轻松搭建自己的网站。 选择适合的建站工具 虽然市面上有…

台达控制器与三菱变频器实现EtherCAT转CC-Link IEFB协议通讯方案

一.项目背景&#xff1a; 在某自动化生产车间中&#xff0c;原有系统采用台达的 EtherCAT 控制器来控制多个设备的运动和操作&#xff0c;但车间内的一些关键设备使用的是三菱变频器&#xff0c;且基于 CC-Link IEFB 协议通讯。为了实现整个系统的集中控制和数据统一管理&#…

Js — 防抖及底层实现

防抖&#xff1a;单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次 防抖实现方式&#xff1a; lodash提供的防抖函数_.debounce(func,[wait0],[option]) 延迟wait毫秒后调用func方法 定时器setTimeout 目标&#xff1a;鼠标在盒子上移动&#xff0c;鼠标停止50…