【Java基础面试题001】Java中序列化和反序列化是什么?

在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更新类加载部分)_哔哩
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值