JAVA序列化与反序列化
2025-12-11 17:11:31 0 举报
AI智能生成
Java序列化与反序列化是一种将对象状态转换为可以保存或传输的格式(如二进制流)的过程。具体来说,序列化是将对象状态转换为字节流的过程,使得这些字节流可以在不同Java虚拟机之间传输;而反序列化则是将字节流恢复为对象状态的过程。 核心内容:序列化涉及对象与字节流之间的转换,主要用在对象的持久化存储(如写入文件)、网络传输(如远程方法调用,RMI)等场景。 文件类型:序列化通常不针对传统意义上的“文件”,而是生成用于存储Java对象数据的序列化数据流或文件,例如一个普通的文件,或者是在网络上通过套接字传输的数据流。 修饰语:Java中的序列化与反序列化是对象持久化、数据交换的重要机制;使用关键字`transient`修饰类成员可以防止它在序列化过程中被序列化;另外,实现`Serializable`接口的类才支持序列化。
作者其他创作
大纲/内容
定义
序列化
将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,就是将对象转换成字节序列。
反序列化
将序列化后的字节序列恢复为对象的过程。
为什么需要序列化
<b>持久化:</b>将对象的状态保存到存储介质(如文件、数据库)中,以便以后使用。<br><br><b>网络传输:</b>在分布式系统(对象需要在不同的JVM之间传递)、远程调用(RMI)或消息队列中传输对象。将对象转换为字节序列,以便在网络上传输。<br><br><b>缓存:</b>序列化对象以存储到 Redis 等缓存系统。
数据库持久化是否必须序列化?
什么情况下数据库持久化<b><font color="#a23735">不需要</font></b>序列化
使用ORM框架(如Hibernate、JPA、Mybatis)
什么情况下数据库持久化<b><font color="#a23735">必须</font></b>序列化
持久化到文件、数据库BLOB字段存储、缓存、分布式传输、远程调用等场景需要
最佳实践建议
1. 实体类设计原则
2. 序列化的方案
方案1:实现java.io.Serializable接口
为什么需要实现 Serializable 接口?
实现该接口主要有以下目的:<br><b>1.标记可序列化:</b>接口本身无方法,但 JVM 会通过它识别类是否支持序列化。<br><br><b>2.保障类型安全性:</b>确保序列化/反序列化过程中的类型一致,避免数据损坏。<br><br><b>3.规范类行为:</b>强制类设计者显式声明序列化意图,避免意外序列化敏感数据。<br>
序列化的工作原理
反序列化的工作原理
关键细节
<b>默认序列化规则:</b><br>序列化时自动保存非静态、非瞬态(non-transient) 字段。<br>transient 关键字可修饰字段,使其不被序列化(如密码等敏感信息)。
<b>自定义序列化逻辑:</b><br>通过重写 writeObject 和 readObject 方法,可控制序列化过程(如加密字段)。
自定义序列化过程
<b>版本控制:</b><br>在反序列化时,JVM会检查字节流中的serialVersionUID和本地类的serialVersionUID是否一致,如果不一致,会抛出InvalidClassException。<br>建议显式声明 serialVersionUID(静态 final long 字段),避免因类结构变化导致反序列化失败(但需要保证兼容性)。
<b>继承与父类:</b><br>若父类未实现 Serializable,子类仍可序列化,但父类需提供可访问的无参构造方法。
注意事项
<b>性能影响:</b>序列化可能带来性能开销,复杂对象序列化时需考虑效率。<br><br><b>安全性:</b>反序列化不受信任的数据可能引发安全漏洞(如恶意代码执行),需谨慎处理。<br>
方案2:JSON序列化(推荐)
方案3:使用JPA的@Convert(属性转换器)
方案4:Protocol Buffers
3.序列化性能对比
四种方式对比
JSON序列化、使用JPA的@Convert、Protocol Buffers<br>三种方式原理对比
实际存储效果对比
性能测试对比
混合方案示例
实际项目推荐
0 条评论
下一页