MST

星途 面试题库

面试题:Java序列化中transient关键字与自定义序列化方法的交互

当一个类既使用了transient关键字修饰某些变量,又重写了writeObject和readObject方法来实现自定义序列化逻辑时,会发生什么情况?请详细说明其执行顺序及原理。
39.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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