面试题答案
一键面试- 执行顺序:
- 序列化时:
- 当调用
ObjectOutputStream
的writeObject
方法对对象进行序列化时,会优先调用该类重写的writeObject
方法。在这个自定义的writeObject
方法中,程序员可以根据需求决定是否对被transient
修饰的变量进行特殊处理。如果在writeObject
方法中没有对transient
变量做特殊处理,按照常规逻辑,transient
修饰的变量不会被默认序列化。但如果程序员在writeObject
方法中显式地对transient
变量进行写入操作,那么这些变量也会被序列化。
- 当调用
- 反序列化时:
- 当调用
ObjectInputStream
的readObject
方法进行反序列化时,会优先调用该类重写的readObject
方法。在这个自定义的readObject
方法中,程序员同样可以根据需求决定如何读取之前序列化的数据,包括是否读取之前在writeObject
方法中特殊处理过的transient
变量的数据。如果在writeObject
方法中对transient
变量进行了写入,并且在readObject
方法中正确读取,那么transient
变量可以恢复到序列化前的状态。
- 当调用
- 序列化时:
- 原理:
transient
关键字:其作用是标记一个变量在对象被默认序列化机制处理时,该变量不会被序列化。它主要用于阻止某些敏感信息(如密码等)或不必要在网络传输或持久化存储中保存的信息被序列化。- 自定义
writeObject
和readObject
方法:通过重写这两个方法,程序员可以完全控制对象的序列化和反序列化过程。Java的序列化机制在遇到对象时,会首先检查该对象所属的类是否有自定义的writeObject
和readObject
方法,如果有则优先调用这些自定义方法,而不是使用默认的序列化机制。这使得程序员可以灵活地决定哪些数据需要被序列化以及如何进行序列化和反序列化,包括对transient
变量的特殊处理,从而满足特定的业务需求。