MST

星途 面试题库

面试题:Java中Transient关键字与自定义序列化策略的关联

当使用Java的ObjectOutputStream进行对象序列化时,若部分成员变量被Transient修饰,同时又需要自定义序列化策略来处理这些变量,应该如何实现?详细说明实现步骤和涉及的关键类及方法。
12.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现步骤
    • 定义类实现Serializable接口
      • 让需要序列化的类实现java.io.Serializable接口。例如:
import java.io.Serializable;

public class MyClass implements Serializable {
    private String normalField;
    private transient int transientField;
    // 构造函数、getter和setter方法等
}
  • 自定义序列化策略
    • 在类中定义writeObjectreadObject方法。这两个方法必须是私有的,并且签名固定。
    • writeObject方法用于定义如何序列化对象,包括处理transient修饰的变量。例如:
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
    out.writeObject(normalField);
    // 处理transientField,例如将其值乘以2后写入
    out.writeInt(transientField * 2);
}
 - `readObject`方法用于定义如何反序列化对象,要与`writeObject`方法的写入顺序和方式对应。例如:
private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
    normalField = (String) in.readObject();
    // 读取处理后的transientField值,再除以2恢复原值
    transientField = in.readInt() / 2;
}
  1. 关键类及方法
    • ObjectOutputStream
      • writeObject(Object obj)方法:用于将对象写入输出流进行序列化。在自定义writeObject方法中,我们可以调用ObjectOutputStream的其他写入方法(如writeInt等)来处理对象的各个部分,包括transient修饰的变量。
    • ObjectInputStream
      • readObject()方法:用于从输入流中读取对象进行反序列化。在自定义readObject方法中,我们使用ObjectInputStream的读取方法(如readInt等)按顺序读取数据,恢复对象状态,包括transient修饰变量的状态。
    • writeObjectreadObject方法
      • 这两个自定义方法是实现自定义序列化策略的核心。在类内部定义这两个方法,按照特定规则处理transient变量的序列化和反序列化过程。