面试题:Java 中 transient 变量有什么作用和特点 ?

transient 是 Java 中的一个关键字,用于修饰类的成员变量。它的主要作用是控制变量的序列化行为


1. 作用

  • 防止变量被序列化:当一个对象被序列化(例如通过 ObjectOutputStream 写入文件或网络传输)时,被 transient 修饰的变量不会被包含在序列化的数据中。
  • 节省存储空间或保护敏感数据:某些变量可能不需要持久化(如临时计算的结果),或者包含敏感信息(如密码),使用 transient 可以避免这些数据被序列化。

2. 特点

  • 序列化时忽略:被 transient 修饰的变量在对象序列化时会被忽略,反序列化时其值为默认值(如 null0 或 false)。
  • 不影响非序列化场景transient 只影响序列化行为,对变量的普通使用没有任何影响。
  • 需要手动处理恢复:如果需要在反序列化后恢复 transient 变量的值,可以通过实现 readObject() 和 writeObject() 方法来自定义序列化和反序列化逻辑。

3. 示例代码

import java.io.*;

class User implements Serializable {
    private String username;
    private transient String password; // 使用 transient 修饰,不会被序列化

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{username='" + username + "', password='" + password + "'}";
    }
}

public class Main {
    public static void main(String[] args) {
        User user = new User("admin", "123456");

        // 序列化
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.txt"))) {
            oos.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.txt"))) {
            User deserializedUser = (User) ois.readObject();
            System.out.println(deserializedUser); // 输出:User{username='admin', password='null'}
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4. 注意事项

  • 默认值:反序列化时,transient 变量的值会被设置为默认值(如 null0 或 false)。
  • 自定义序列化:如果需要保留 transient 变量的值,可以通过实现 readObject() 和 writeObject() 方法来自定义序列化逻辑。
  • 静态变量transient 不能修饰静态变量,因为静态变量属于类而非对象,序列化是针对对象的。

5. 总结

  • transient 关键字用于标记不需要序列化的变量。
  • 它可以节省存储空间或保护敏感数据。
  • 反序列化时,transient 变量的值会被设置为默认值,如果需要恢复值,可以自定义序列化逻辑。
THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容