请解释Java中的序列化和反序列化是什么?
考察说明
考查对Java序列化机制的理解,包括定义、用途、实现方式和注意事项。
回答思路
- 【回答框架 1】序列化是将对象状态转换为可存储或传输的字节序列的过程,反序列化是逆过程,将字节序列恢复为对象。Java通过实现java.io.Serializable接口来支持序列化,该接口是一个标记接口,不包含方法。
- 【回答框架 2】序列化的主要用途包括:将对象持久化到磁盘、在网络中传输对象(如RMI、分布式系统)、缓存等。默认序列化机制通过ObjectOutputStream和ObjectInputStream实现。
- 【回答框架 3】序列化过程中,transient修饰的字段不会被序列化,static字段属于类级别,也不会被序列化。serialVersionUID用于版本控制,若未显式声明,JVM会根据类结构自动生成,类结构变化会导致InvalidClassException。
- 【回答框架 4】自定义序列化可以通过实现Externalizable接口或重写writeObject和readObject方法,控制序列化过程,提升性能或保护敏感数据。
- 【回答框架 5】需要注意序列化的性能开销和安全性,反序列化可能被利用执行恶意代码,需校验数据来源并考虑使用白名单。
- 【关键点 1】序列化是对象到字节流的转换,反序列化是反向过程。
- 【关键点 2】实现Serializable接口即可启用默认序列化,transient和static字段不参与。
- 【关键点 3】serialVersionUID用于版本一致性校验,显式声明更安全。
- 【关键点 4】自定义序列化可通过writeObject和readObject实现。
- 【关键点 5】反序列化存在安全风险,需注意数据来源。
- 【易错点 1】忽略serialVersionUID可能导致InvalidClassException。
- 【易错点 2】序列化包含敏感信息未使用transient或加密,造成泄露。
- 【易错点 3】反序列化未做安全校验,可能被注入恶意对象。