Java 中的序列化和反序列化

Java 中的序列化和反序列化是一种重要的机制,可以使对象在保存和传输过程中保持其状态,广泛应用于持久化、网络传输和分布式计算中。虽然原生的序列化机制使用起来很方便,但由于性能、安全等方面的限制,在现代软件开发中,往往会使用更加高效和安全的替代方案,例如 JSON、Protobuf 等。

  • 序列化 (Serialization):将 Java 对象转换为字节流的过程,方便存储到文件、数据库,或者通过网络进行传输。
  • 反序列化 (Deserialization):将字节流转换回 Java 对象的过程。

序列化和反序列化通常用于保存对象的状态,或者在分布式系统中通过网络将对象进行远程通信。


在 Java 中实现序列化和反序列化,主要通过以下方法:

  1. 实现 Serializable 接口

    • Java 提供了一个内置接口 java.io.Serializable,它是一个标记接口,没有任何方法。
    • 只要一个类实现了 Serializable 接口,这个类的对象就可以被序列化。
  2. 使用 ObjectOutputStreamObjectInputStream 进行读写

    • 序列化:通过 ObjectOutputStream 将对象写入到文件或其他输出流中。
    • 反序列化:通过 ObjectInputStream 从输入流中读取对象。

    代码示例:

    import java.io.*;public class SerializationDemo {public static void main(String[] args) {Person person = new Person("Alice", 30);// 序列化对象try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {oos.writeObject(person);System.out.println("对象已序列化");} catch (IOException e) {e.printStackTrace();}// 反序列化对象try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {Person deserializedPerson = (Person) ois.readObject();System.out.println("对象已反序列化: " + deserializedPerson);} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
    }
    

serialVersionUID 的作用

serialVersionUID 是序列化过程中非常重要的一个属性,用于验证序列化对象的版本一致性。它是一个唯一标识符,帮助 JVM 在反序列化时确认对象的版本。

  • 如果类发生了变化(如增加字段、修改方法等),serialVersionUID 不一致,反序列化时会抛出 InvalidClassException 异常。
  • 建议显式地声明 serialVersionUID,例如:
    private static final long serialVersionUID = 1L;
    

序列化的控制

  • transient 关键字:用来避免序列化某些不需要的字段。例如,一些敏感数据(如密码)不需要被序列化,可以用 transient 修饰。

    private transient String password;
    

    这样,在序列化和反序列化的过程中,password 字段的值会被忽略。

  • Externalizable 接口:比 Serializable 更为复杂,提供更多的控制。它要求实现 writeExternal()readExternal() 方法,以便手动控制对象序列化和反序列化的过程。


序列化的应用场景

  1. 缓存和持久化对象

    • 在应用中,有时需要将对象持久化存储到磁盘中以便稍后恢复。比如,保存某个游戏的状态,或将会话数据存储到本地。
    • Java 序列化可以直接将对象写入文件(通常为 .ser 文件),以便下次可以恢复这些对象的状态。
  2. 网络传输

    • 在分布式系统中,Java 的远程方法调用 (RMI) 允许对象通过网络进行传输。
    • 序列化在 RMI 中非常重要,客户端可以将对象发送到远程服务器进行计算,而这些对象必须是可序列化的。
  3. 分布式系统

    • Java 序列化在分布式系统中经常用作对象远程调用的基础。在消息中间件(如 Apache Kafka)中,可以将 Java 对象序列化为字节流来传输。
    • Spring 框架中的一些技术也利用序列化来存储用户会话。
  4. 缓存系统

    • 对象序列化也常用于缓存系统中,比如 Redis 这样的内存缓存中,序列化可以将对象状态存储到缓存中,以便加速后续的访问。

缺点与替代方案

  • 序列化的性能开销:Java 原生序列化的速度较慢,且序列化后的字节流较大。
  • 兼容性问题:Java 序列化的版本控制比较复杂,稍有改动可能导致反序列化失败。
  • 安全问题:Java 序列化容易受到反序列化漏洞的攻击,攻击者可以通过操纵输入流来执行恶意代码。

因此,在实际生产环境中,往往会选择其他更高效和安全的序列化机制,例如:

  • JSON 和 XML:常用于跨平台的数据传输。
    • GsonJackson 等库可以将 Java 对象转换为 JSON 格式进行序列化和反序列化。
  • Protobuf:Google 的 Protocol Buffers 是一种高效的序列化机制,适用于跨语言的场景。
  • Kryo:一个性能较高的序列化库,比 Java 原生序列化速度更快、字节数更少,适合高性能需求的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务的雪崩问题

微服务的雪崩问题: 微服务调用链路中的某个服务故障,引起整个链路种的所有微服务都不可用。这就是微服务的雪崩问题。(级联失败),具体表现出来就是微服务之间相互调用,服务的提供者出现阻塞或者故障&#x…

使用vue+kkFileview组件实现各种类型文件预览

关于kkFileView 【参考】:https://kkfileview.keking.cn/zh-cn/docs/home.html 文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览 本项目介绍 项目使用…

低空经济产业链、政策、延伸品调研笔记

文章目录 1 低空经济市场1.1 政策摘要1.2 市场规模预测 3 涉及产业链与核心产品3.1 产业链3.2 原材料3.2.1 上游3.2.2 中游3.2.3下游 3.3 无人机3.4 eVTOL3.5 空管系统 4 应用场景4.1 城市空中出行(UAM)4.2 低空物流4.3 低空旅游与体验4.4 农林植保与监测4.5 基础设施巡检与维护…

JVM基础(内存结构)

文章目录 内存结构JAVA堆方法区 (Method Area)运行时常量池(Runtime Constant Pool) 虚拟机栈 (Java Virtual Machine Stack)本地方法摘栈(Native Method Stacks)程序计数器&#xf…

Matlab 车牌识别技术

1.1设计内容及要求: 课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…

智慧共享空间解决方案是什么

一、智慧共享空间解决方案的定义 智慧共享空间解决方案是一种综合性的策略和技术手段,旨在通过整合智慧技术与共享空间的概念,为公众共同使用的空间提供高效、智能、可持续的运营和管理模式,以满足人们在不同环境下的各种需求,并…

前端分页:非当前页进行表单验证

概览 对于大数据量批量导入,渲染到表格的场景中,可能会造成浏览器崩溃,此时前端分页可以很好地解决这个问题,但是组件库自带的表单验证通常只能进行当前页的验证,如何实现对全量数据的表单验证呢?此篇文章…

C++基于opencv的视频质量检测--画面冻结检测

文章目录 0.引言1. 原始代码分析2. 优化方案3. 优化后的代码4. 代码详细解读 0.引言 视频质量画面冻结检测已在C基于opencv4的视频质量检测中有所介绍,本文将详细介绍其优化版本。 1. 原始代码分析 图像抖动检测的原始代码: bool ScreenFreezeDetect…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球,企业对快速构建应用程序的需求愈发强烈。然而,传统的软件开发周期冗长、成本高昂,往往无法满足快速变化的市场需求。在此背景下,低代码平台逐渐成为开发者和企业的优选方案,以其“低…

【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python计算小球 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算小球 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

架构师备考-非关系型数据库

基础理论 CAP 理论 C(Consistency)一致性。一致性是指更新操作成功并返回客户端完成后,所有的节点在同一时间的数据完全一致,与ACID 的 C 完全不同。A (Availability)可用性。可用性是指服务一直可用&…

内网渗透-初探域渗透

文章目录 环境域信息收集系统基本信息网络信息域控主机信息根据ip查主机名用户信息权限提升网络探针系统命令nbtscanfscannishang 凭据收集 域渗透实战凭据收集(重点)mimikatzProcdumpPwdumpSAMInsidekrbtgt用户hash hash破解解决无法获取明文的问题明文口令传递IPC连接atschta…

DispatchingController

目录 1、 DispatchingController 1.1、 //维修派工 1.2、 ClearDispatching 1.3、 查询派工结算方式金额 DispatchingController using QXQPS.Models; using QXQPS.Vo; using System; using System.Collections.Generic; using System.Linq; using System.Web; …

windows录屏软件工具推荐!!

如今,科技的进步,互联网的普及,使我们的生活越来越便利,录屏工具的出现,大大提高我们的工作效率。如果你经常需要录制屏幕上的内容,比如制作教学视频、游戏实况记录、演示文稿等等,那这几款软件…

【ChatGPT】如何通过反向思维改进Prompt的编写

如何通过反向思维改进Prompt的编写 在与ChatGPT互动的过程中,编写高质量的Prompt(提示词)是确保生成内容准确且符合需求的关键。反向思维(Reverse Thinking)是一种创造性思维方法,通过从结果或目标出发&am…

【病毒分析】从无解到破解:Mallox家族linux版本的分析以及解密器的制作

1.背景 Mallox勒索软件首次出现于2021年5月,并在2021年10月扩展到中国市场。截至2024年,它仍然活跃。Mallox通过加密受害者文件并要求支付赎金来恢复数据,使用唯一的加密密钥加密文件,受害者的文件通常会添加“.mallox”或“.mal…

Linux系统之date命令的基本使用

Linux系统之date命令的基本使用 一、date命令介绍二、检查本地系统环境2.1 检查系统版本2.2 检查yum仓库 三、date命令的使用帮助3.1 date命令的帮助信息3.2 date命令参数解释3.3 date命令常用的选项 四、date命令的日常使用4.1 直接显示时间4.2 格式化输出时间4.3 时间格式转换…

【LeetCode每日一题】——862.和至少为 K 的最短子数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 前缀和 二【题目难度】 困难 三【题目编号】 862.和至少为 K 的最短子数组 四【题目描述】 …

【ROS2】Qt和ROS混合编程:多继承QObject和rclcpp::Node

1、说明 如果想在一个类中,即使用Qt的信号和槽(程序内部通信),同时也使用ROS2的发布、订阅消息机制(程序之间通信),如何操作? 可以尝试多重继承:QObject 和 rclcpp::Node 2、示例 1)头文件 class laoer_object_node : public QObject, public rclcpp::Node {Q_O…

我在1024谈华为

华为的发展历程与技术创新 华为自成立以来,一直是通信技术领域的重要参与者。让我们回顾一下华为的一些关键发展里程碑: 1987年,华为在深圳成立,起初专注于电话交换网络的研发和销售。 进入1990年代,华为转型为通信…