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