在Java中,序列化和反序列化是用于将对象的状态保存和恢复的重要机制。
序列化
是将Java对象转换为字节流的过程,这样Java对象才可以网络传输、持久化存储还有缓存。Java提供了java.io.Serializable接口来支持序列化,只要类实现了这个接口,就可以将该类的对象进行序列化
反序列化
是将字节流重新转化为Java对象的过程,即从存储中读取数据并重新创建对象
相关要点
- 应用场景:包括网络传输、远程调用、持久化存储(如保存到文件或者数据库)、以及分布式系统中数据交换
- 相关类和接口:ObjectOutputStream用于序列化,ObjectInputStream用于反序列化。类必须实现Serializable接口才能被序列化
- 忽略字段:Java提供的Transient关键字可以标记不需要被序列化的字段,这些字段在反序列化时,会被初始化为其对应默认值(null,0,false等)

- 业务中建议忽略的字段:
- 敏感信息(密码/API密钥/个人身份信息/信用卡号等),
- 计算值(用户会话ID/临时数据/缓存值/动态计算结果等),
- 大对象或集合( 会带来性能开销,指向大文件的引用会导致序列化后的数据体积庞大 / 不必要的超大集合等),
- 标志位或状态字段(这些字段用于内部逻辑控制而不是对外接口)
- 冗余字段(可以从其他字段推导出的数据)
- 版本控制:每个Serializable类都应该定义一个serialVersionUID,用于在反序列化时验证版本的一致性。如果没有明确指定,Java会根据类的定义自动生成一个UID,可是这种自动生成的UID可能在不同的编译器或不同的JDK版本之间变化,版本不匹配可能导致反序列化失败

- 序列化性能问题:Java的默认序列化机制可能比较慢,尤其是对于大规模分布式系统,可能会选择更加高效的序列化框架(如 Protobuf、Kryo)
- 安全性:反序列化是一个潜在的安全风险,因为通过恶意构造的字节流,可能会加载不安全的类或执行不期望的代码。因此反序列化过程需要进行输入验证,避免反序列化漏洞(相关教程:Java反序列化漏洞专题-基础篇(21/09/05更新类加载部分)_哔哩

最低0.47元/天 解锁文章
1019

被折叠的 条评论
为什么被折叠?



