深入理解Java的序列化和反序列化机制——Serializable

Java对象序列化与反序列化详解及实战 是java.io包中定义的一个空接口:该接口没有任何方法,其存在的意义是告诉 Java 虚拟机(JVM):这个类的对象可以被序列化。当一个类实现了接口时,Java 会自动使用默认的序列化机制将其对象转换为字节流。意义- 支持对象状态的持久化与传输;- 为分布式系统、远程方法调用(RMI)、对象缓存等提供基础能力;- 简化了数据结构的序列化过程。默认的序列化机制虽然方便,但在某些情况下可能无法满足需求。例如,某些字段需要手动处理、对象中包含敏感信息、或对象结构复杂等。 阅读详情

在网络通信(Socket)或远程过程调用(RPC(RMI))中,我们通常都会发送和接收一个对象,比如

ObjectOutputStream oos = new ObjectOutputStream(out);

oos.writeObject(obj);

……

ObjectInputStream ois  = new ObjectInputStream(in);

Object obj = ois.readObject();

当一个对象实现了Serializable接口后,意味着这个对象是可以序列化的,当然这个操作对用户来说是透明的,为什么呢?因为用户不用关心JVM到底都做了什么呢?用户只关心将这个对象声明成可序列化的就行了。那么到底什么是JAVA序列化和反序列化呢?


1.什么是学序列化(反序列化)?

序列化:将一个对象以字节的方式来描述(存储)。

反序列化:将字节转换(翻译)成一个对象。


2.JVM是如何实现序列化(对象和字节的转换)的?

◆将对象实例相关的类元数据输出。

                    
◆递归地输出类的超类描述直到不再有超类。

                    
◆类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。

                    
◆从上至下递归输出实例的数据

具体实现细节可以参考Core Java书籍


3.哪些对象是不可(不需要)序列化的?

(1).静态成员是不可序列化的

(2).被transient修饰的对象时不可序列化的,或者说你在设计的时候发现,如果这个对象不需要序列化,你可以把它声明成transient

Java对象序列化与反序列化机制解析 本文详细介绍了Java中的对象序列化和反序列化的概念、过程和实现。通过实例演示了如何将对象状态转换为字节流进行持久化存储,以及如何从字节流中恢复对象状态。同时,文章分析了序列化过程中可能遇到的问题,如非可序列化对象的处理,以及transient关键字的使用场景。 阅读详情

相关推荐

VisionMaster 4.2.0安装

按照顺序安装。

XuXing_java的专栏 3807

序列化和反序列化的实现原理

基本理论概念 1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程 (2)序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制...

weixin_43177615的博客 3304

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 488

面试题之序列化与反序列化

一、简介 概念: 序列化:把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象,这个相反的过...

weixiaohuai的博客 2063

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5052

杭电计算机组成原理课程设计-实验七-寄存器堆设计实验

寄存器堆实验实验原理实验内容模块功能说明模块逻辑引脚图寄存器堆模块代码REG模块测试用例REG-ALU测试用例实验结果记录 寄存器堆实验结果及分析ALU_REG运算器模块实验结果及分析探索与思考 实验原理   32×32位的寄存器堆模块示意图如图所示,含有32个寄存器,每个寄存器32位。该寄存器堆具有A和B两个读端口,分别由 5 位的寄存器编号 R_Addr_A 和 R_Addr_B 来寻址 2 个寄存器,读出的数据则由 R_Data_A(32 位)和R_Data_B(32 位)输出。读访问时,没有使能或者

HDU-整蛊小子-⏰☂️/蚂蚁集团研发工程师 1万+

java基础知识点2:序列化与反序列化详解

1)Serialization(序列化):将 java 对象以一连串的字节序列保存在本地磁盘中的过程,也可以说是保存 java 对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中),避免程序运行结束后对象从内存中消失,字节序列也方便在网络中传输。2)deserialization(反序列化):将保存在磁盘文件中的 java 字节序列重新转换成 java 对象称为反序列化。

m0_64355295的博客 2597

QTI Camera Stack 中的多摄调度模型与 SyncGroup 实现机制详解

在当前高端移动影像系统中,搭载主摄、长焦、超广、ToF、IR 等多个图像模组已成标配,实现高效、低延迟、高稳定性地调度这些 Sensor 的图像能力成为 QTI Camera Stack 架构的关键组成。高通平台通过构建 Camera SyncGroup 模型与多层调度策略,在 ISP 层实现多模组图像流的绑定控制、帧级时间同步、主副摄无感切换、双路并发采集等能力。 本文基于 Snapdragon 8 Gen 系列平台的实际调测经验,系统解析 Camera Stack 中多摄调度模型的结构设计、各层模块职责

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1055

【序列化】浅谈java序列化

一、基本概念 1、什么是序列化和反序列化 序列化是指将Java对象转换为字节序列的过程,而反序列化则是将字节序列转换为Java对象的过程。 Java对象序列化是将实现了Serializable接口的对象转换成一个字节序列,能够通过网络传输、文件存储等方式传输 ,传输过程中却不必担心数据在不同机器、不同环境下发生改变,也不必关心字节的顺序或其他任何细节,并能够在以后将这个字节序列完全恢复为原来...

applehub的博客 390

JumpServer未授权访问漏洞 CVE-2023-42442

JumpServer 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统。 JumpServer 使用Python / Django 进行开发。2021年1月15日,阿里云应急响应中心监控到开源堡垒机JumpServer发布更新,修复了一处远程命令执行漏洞。由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求获取到日志文件获取敏感信息,或者执行相关API操作控制其中所有机器。

holyxp的博客 1426

YOLOv8 智能交通违章检测 - 机动车道占用(违停/非机动车占道)详解

本文提出基于YOLOv8的智能交通违章检测方案,主要针对机动车道占用问题。系统整合目标检测、目标跟踪和ROI区域判定,实现两种典型场景检测:违章停车(静止超时)和非机动车/行人占道。详细介绍了系统架构、配置文件设计、核心逻辑实现及可视化模块,包括ROI区域管理、状态跟踪和违章判定算法。针对实际应用中的堵车误判、非机动车误报等问题,提出了密度检测、轨迹分析和自适应阈值等优化策略。该方案计算量适中,适合边缘设备部署,并建议配套开发ROI标定工具和证据链保存功能。

u010117029的博客 238

序列化反序列化为何要实现Serializable接口

文章目录序列化反序列化为何要实现Serializable接口概念使用情况为何要指定serialVersionUID的值特性 序列化反序列化为何要实现Serializable接口 概念 序列化:把对象转换成字节序列的过程 反序列化:把字节序列恢复为对象的过程 使用情况 只在本地jvm里面运行程序时,是不需要序列化与反序列化的,当我们需要将内存中的对象持久化到磁盘,数据库中,或者与数据库进行交互时,就需要序列化与反序列化了。 结论:在对内存中的对象进行持久化或网络传输时,需要用到序列化或反序列化。 服务器与

刘翼荣的博客 431

openwrt之luci通信原理(一)

从模板中分离,每个LuCI2子页面也需要一个定义并存放在/www/luci2/view/目录下的一个视图,视图是使用了子页面特定对象的L.ui.view扩展的JavaScript文件。有一点需要注意的是需要提供execute方法,创建视图失败有几种原因,特别是当它需要ubus加载额外的数据使用的时候。所以在execute方法中提供成功或者失败的信息是有意义的。不幸的是在异步方法加载特定数据的时候,不能简单的返回true或false,解决的方法是返回一个Promise对象来运行推迟提供是否成功的信息。

1150

Java中的序列化和反序列化:深入理解和实战

序列化和反序列化的本质是解决在进行远程通信和持久化数据时,如何保存和恢复数据的问题。** 序列化:** 将数据结构或对象转换成二进制字节流的过程** 反序列化: ** 将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程为什么要进行序列化和反序列化操作?其实主要是为了持久化和进行传输,我们都知道在Java 中一些数据都是以对象的形式存在的,那如果我想把对象传输其他人怎么办?

无限进步的博客 1189

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

深入理解 Java 序列化:Serializable 接口到底有什么用?

Java序列化机制解析:Serializable接口的核心作用 摘要:Java中的Serializable接口是一个空接口,作为标记接口(Marker Interface)存在,用于授权JVM进行对象序列化操作。它的核心功能包括:1)作为对象序列化的"通行证",未实现该接口的类在序列化时会抛出NotSerializableException;2)配合serialVersionUID实现版本控制,确保类结构变更时的兼容性;3)支持transient关键字保护敏感字段不被序列化。序列化主要用

曦煜墨白的博客 1019

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 对象的序列化与反序列化:深入理解与实践

序列化是指将 Java 对象转换为字节序列的过程。这个字节序列可以存储在磁盘上,也可以通过网络传输。在 Java 中,对象序列化机制可以将对象的状态信息保存为字节数组,以便在需要时重新构建对象。除了实现接口进行默认序列化外,Java 还提供了接口,允许开发者完全控制对象的序列化和反序列化过程。实现接口的类必须实现和两个方法。接口的特点:完全控制:开发者可以精确控制哪些字段被序列化,以及序列化的顺序和格式。性能优化:通过自定义序列化过程,可以避免序列化不需要的字段,从而减小序列化文件的大小,提高性能。

weixin_56018532的博客 772

【Java笔记】 深入理解序列化和反序列化

多思考,多行动

小新的博客 684

Java序列化的奇幻之旅:为何我们追求Serializable?

今天,我们就来揭开这股力量的神秘面纱,深入理解Java序列化机制,探索为什么要实现Serializable。这时,Serializable就像是一个魔法,能够将这个三维的对象压缩成一维的字节流,让它穿越时空的隧道。Serializable是Java世界中一个强大的魔法,它让我们的对象能够穿越时空,跨越平台。但正如所有的魔法一样,它也需要我们谨慎使用,并不断探索更好的使用方式。如果没有Serializable,每个平台都需要有自己的一套规则来理解对象,这就像是每个国家都有自己的语言,沟通起来非常困难。

龚小帅的博客 1161

深入理解java序列化和反序列化

目录1.定义2. 方法3.自定义的序列化和反序列化策略4. 为什么必须实现Serializable4.使用场景5. 总结 1.定义 Java序列化是指把Java对象转换为字节序列的过程; Java反序列化是指把字节序列恢复为Java对象的过程。 对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。 2. 方法 序列化 //把对象user写入到tempFile文件中 ObjectOutputStream oos = null;

yyqhwr的博客 300

深入理解 Java 序列化:实现 Serializable 接口与 serialVersionUID 的重要性

Java序列化机制解析:Serializable接口与serialVersionUID的作用 摘要:Java序列化通过Serializable接口实现对象与字节流的相互转换,主要用于对象持久化和网络传输。实现时只需让目标类实现Serializable标记接口,并通过ObjectOutputStream/ObjectInputStream进行读写操作。核心机制serialVersionUID用于版本控制,确保序列化兼容性。若类结构改变但未更新该值,反序列化会抛出InvalidClassException。

Knight 1460

为什么要实现 Serializable?——深入理解 Java 序列化机制

Java序列化机制解析:为什么需要实现Serializable接口 摘要:Java中的Serializable接口是一个标记接口,用于标识类对象可被序列化。当需要将对象保存到文件、网络传输或分布式系统(如Dubbo)使用时必须实现该接口,因为Java序列化机制需要它来确认对象可被转换。但在HTTP/JSON交互中不需要实现Serializable,因为此时使用的是JSON转换而非Java原生序列化。设计上不自动序列化所有类主要出于安全性和效率考虑:防止敏感数据泄露,并避免不必要的性能开销。

Zyang_CodeBoy的博客 260

深入理解Java序列化机制

默认序列化方法 基本形式 基本形式非常简单,要让类支持序列化,只需要实现Serializable接口即可,该接口是一个标记接口。序列化的类的所有实例域必须都是可序列化的,也就是说,实例域为引用类型,则该类型也必须实现Serializable。 public class WriteObject { public static void main(String[] args) { try (ObjectOutputStream oos = new ObjectOutputStream(

KDLin‘s Blog 411

Java对象的序列化与反序列化

序列化是将对象的状态转换为可存储或可传输的形式的过程。在Java中,序列化是一种将对象转换为字节序列的过程,可以用于将对象写入文件、数据库或通过网络传输。反序列化则是序列化的逆过程,即将字节序列恢复为Java对象。本文将讲解序列化机制、自定义序列化策略,以及如何安全地进行对象的序列化和反序列化

哎 你看的博客 677

序列化和反序列化

理解核心:序列化是将对象转换为字节流,反序列化是将其恢复。Java:标记接口,方便但有局限。:务必显式声明,用于版本兼容性。transient:排除不需要序列化的字段。自定义:在特殊场景下通过readObject增强控制。选择合适的协议:在分布式系统中,根据性能、跨语言和安全需求,优先考虑 Kryo、Protobuf、Hessian 或 JSON 等替代方案。安全至上:警惕反序列化漏洞,不要反序列化不可信数据。

iku_n的博客 423

深入理解Java序列化机制:ObjectOutputStream源码简要分析

一、引言 java.io.ObjectOutputStream是实现序列化的关键类,它可以将一个对象转换成二进制流,然后可以通过ObjectInputStream将二进制流还原成对象。 在阅读ObjectOutputStream源码之前,我们先来回顾一下序列化相关的基础知识: 1、需要序列化的类必须实现java.io.Serializable接口,否则会抛出NotSerializableEx...

APlus 1万+
上一篇: 深入理解Java的迭代器Iterator
下一篇: 转载——数据库设计的技巧,从遵从范式到效率提升
骆驼银子
博客等级 码龄17年 5粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值