MST

星途 面试题库

面试题:Java中transient关键字在序列化场景下的作用

请阐述在Java序列化时,transient关键字修饰成员变量会产生什么效果,并举一个简单的代码示例说明。
31.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

效果

当在Java中使用transient关键字修饰成员变量时,该变量在对象进行序列化时不会被持久化保存。也就是说,在将对象转换为字节流进行存储或传输的过程中,被transient修饰的变量的值不会包含在序列化后的字节流中。当反序列化该对象时,被transient修饰的变量将被赋予其类型的默认值(如int为0,Objectnull等)。

代码示例

import java.io.*;

class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    // 使用transient关键字修饰password变量
    private transient String password;

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

    public void display() {
        System.out.println("Name: " + name + ", Password: " + password);
    }
}

public class SerializationExample {
    public static void main(String[] args) {
        User user = new User("John", "secret");

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

        // 反序列化对象
        User deserializedUser;
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.ser"))) {
            deserializedUser = (User) ois.readObject();
            deserializedUser.display();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,User类实现了Serializable接口,其中password变量被transient修饰。当对User对象进行序列化和反序列化后,输出结果中password将为null,因为它在序列化过程中没有被保存。