news 2026/6/23 11:38:00

Java对象为什么要进行序列化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java对象为什么要进行序列化

序列化(Serialization)是将内存中的对象或数据结构转换为可存储或可传输的格式(如字节流、JSON、XML 等)的过程。它的核心目的,是为了让“活在内存里的对象”能够跨越时空、平台和进程的边界,实现持久保存或远程传递。


一、为什么需要序列化?——三大核心原因

✅ 1.持久化存储(Persistence)

对象只存在于 JVM 内存中,程序一关就消失。
序列化可以把它“冻结”成文件或数据库记录,下次启动再“解冻”回来。

典型场景

  • 保存用户登录状态到 Redis
  • 将游戏进度写入本地文件
  • 缓存计算结果到磁盘(如 Ehcache)
  • Web 应用中保存 Session(如 Tomcat 的SESSION.ser

💡 就像“存档”和“读档”:序列化 = 存档,反序列化 = 读档

10


✅ 2.网络传输(Remote Communication)

网络只能传输字节流,不能直接传 Java 对象。
必须把对象转成通用格式(如 JSON、Protobuf、Java 原生字节流),对方才能解析。

典型场景

  • 微服务之间通过 HTTP/RPC 调用传递对象(如 Spring Cloud Feign)
  • 客户端向服务器提交表单数据(前端 JSON → 后端 Java 对象)
  • 消息队列(Kafka、RabbitMQ)中发送消息体
  • 远程方法调用(RMI、Dubbo)

🌐 没有序列化,分布式系统根本无法工作


✅ 3.跨平台/跨语言交互(Interoperability)

不同系统可能用不同语言(Java、Python、Go),但只要约定好序列化格式(如 JSON、Protobuf),就能互相理解。

典型场景

  • 前端(JavaScript)与后端(Java)通过 JSON 通信
  • 大数据系统(Spark + Python)交换数据
  • 移动端(iOS/Android)与服务端共享数据模型

🔗 JSON、XML、Protocol Buffers 等格式就是“通用语言”


二、不序列化会怎样?

场景问题
直接把对象写入文件文件是乱码,且无法在另一台机器还原(指针、内存地址无意义)

1

直接在网络上传对象TCP 只认字节,对象无法被识别,连接失败
关闭程序后重启所有对象丢失,无法恢复用户状态

❌ 对象是“活”的,但存储介质和网络是“死”的——必须“打包”才能运输


三、常见序列化格式对比

格式特点适用场景
Java 原生序列化二进制,支持复杂对象图,但仅限 JavaRMI、本地缓存
JSON文本,可读性强,跨语言支持好Web API、配置文件

13

XML结构清晰,但冗长旧企业系统、SOAP 服务
Protocol Buffers二进制,体积小、速度快高性能微服务、gRPC

19

MessagePack比 JSON 更紧凑移动端、IoT 设备

📦 选择哪种格式,取决于性能、可读性、跨语言需求。


四、一句话总结

序列化 = 把“活对象”打包成“标准包裹”,以便存储、邮寄或交给别人拆开使用。

没有它:

  • 数据无法持久保存
  • 服务无法远程调用
  • 系统无法协同工作

因此,序列化是现代软件开发(尤其是分布式系统)的基础设施之一

private static final long serialVersionUID = 1L


是 Java 中用于序列化(Serialization)版本控制的一个特殊字段。它的作用是确保在反序列化时,对象的类版本与当前代码中的类版本兼容


🔍 逐词解释

关键字含义
private仅在本类内部可见(通常不需要外部访问)
static属于类本身,而不是某个实例(所有对象共享同一个值)
final值一旦赋值就不能再修改(常量)
long数据类型是 64 位长整型
serialVersionUID = 1L显式指定序列化版本号为1L表示 long 类型字面量)

✅ 核心作用:版本一致性校验

当一个类实现了java.io.Serializable接口后,Java 序列化机制会在序列化反序列化时使用serialVersionUID进行校验:

  1. 序列化时:JVM 将对象写入字节流,并同时写入该类的serialVersionUID
  2. 反序列化时:JVM 读取字节流中的serialVersionUID,并与当前本地类的serialVersionUID比较
    • ✅ 相同 → 认为版本一致,允许反序列化
    • ❌ 不同 → 抛出InvalidClassException异常,防止数据错乱

💡 就像“身份证号”:只有 ID 匹配,才认为是同一个“人”。


🌰 举个例子

版本 1(初始)
public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; }

→ 序列化保存了一个User对象到文件。

版本 2(新增字段)
public class User implements Serializable { private static final long serialVersionUID = 1L; // 保持不变! private String name; private int age; // 新增字段 }

→ 反序列化旧对象时:

  • name正常恢复
  • age自动设为默认值0
  • 不会报错!因为serialVersionUID相同

但如果没显式声明serialVersionUID,Java 会根据类结构自动生成。一旦你加了age字段,自动生成的 ID 就变了,反序列化就会失败!


❓ 为什么建议显式声明?

情况是否显式声明serialVersionUID结果
✅ 显式声明(如= 1L即使类结构变化,只要 ID 不变,仍可反序列化(兼容小改动)
❌ 不声明Java 自动生成 ID;类一改,ID 就变 → 反序列化失败

⚠️ 自动生成的 ID 极其敏感:改一个字段、加一个方法、甚至换 JDK 版本都可能导致 ID 变化!


🛠 最佳实践

  1. 所有实现Serializable的类都应显式声明serialVersionUID
    public class MyEntity implements Serializable { private static final long serialVersionUID = 1L; // 或任意固定 long 值 }
  2. 初始值可以是1L,后续若做不兼容变更**(如删除关键字段),再改为2L3L...**
  3. 不要随意更改它,除非你明确要“打破向后兼容”

💡 补充说明

  • 如果你从不序列化对象(比如只用 JSON 传输),可以忽略它。
  • IDE(如 IntelliJ IDEA)通常会提示:“Serializable class without serialVersionUID”,建议加上。

✅ 总结

private static final long serialVersionUID = 1L;
是一份“版本契约”

  • 它告诉 JVM:“这个类的序列化格式从版本 1 开始”
  • 只要你不改它,即使类升级,旧数据也能安全读取
  • 是 Java 序列化机制中保障兼容性与稳定性的关键设计

所以,看到它,就放心地保留它 👍

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 19:54:50

Flutter GPUImage 库在鸿蒙平台的 GPU 图像滤镜适配实战

Flutter GPUImage 库在鸿蒙平台的 GPU 图像滤镜适配实战 引言 在跨平台开发中,Flutter 凭借高效的渲染和活跃的生态,已经成为许多团队的首选。而另一边,OpenHarmony 作为新兴的全场景操作系统,正在逐步构建自己的应用生态。把成熟…

作者头像 李华
网站建设 2026/6/23 18:08:15

MapStruct使用笔记

文章目录maven依赖其他无限循环引发内存问题文档主要为了解决对象的映射问题。maven依赖 <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.5.5.Final</version> </dependency> &…

作者头像 李华
网站建设 2026/6/22 20:54:43

【大模型视觉新突破】:Open-AutoGLM如何重构多尺度感知能力?

第一章&#xff1a;Open-AutoGLM 多分辨率适配方案在视觉语言模型&#xff08;VLM&#xff09;的实际部署中&#xff0c;输入图像的分辨率差异极大&#xff0c;从低清监控画面到高分辨率卫星图像均可能成为推理输入。Open-AutoGLM 引入了一套动态多分辨率适配方案&#xff0c;能…

作者头像 李华
网站建设 2026/6/23 21:46:12

Open-AutoGLM文本处理瓶颈攻坚(精准输入技术全公开)

第一章&#xff1a;Open-AutoGLM文本输入准确率提升方法概述在自然语言处理任务中&#xff0c;Open-AutoGLM模型的输入文本质量直接影响其推理与生成结果的准确性。为提升文本输入的准确率&#xff0c;需从数据预处理、语义规范化和上下文增强三个核心方向入手。通过系统性优化…

作者头像 李华
网站建设 2026/6/23 21:29:23

12、流程工厂数字孪生的商业案例剖析

流程工厂数字孪生的商业案例剖析 服务解决方案的关键要素 在提供流程工厂数字孪生服务解决方案时,有几个关键要素起着决定性作用。首先是人员角色,主要包括 AI 开发者、数据科学家、产品所有者和产品经理。 - AI 开发者 :负责算法的实施、优化和 AI 的训练。准确的数据…

作者头像 李华
网站建设 2026/6/16 2:39:58

Open-AutoGLM多分辨率适配实战指南(从原理到部署的完整路径)

第一章&#xff1a;Open-AutoGLM多分辨率适配方案概述Open-AutoGLM 是一种面向多模态大模型的动态分辨率自适应框架&#xff0c;专为处理不同输入尺度下的视觉语言任务而设计。该方案通过引入可学习的空间对齐模块与分辨率感知的注意力机制&#xff0c;实现了在不依赖固定图像尺…

作者头像 李华