transient关键字的作用

在Java中,transient关键字用于标记对象中的某个字段,使其在序列化时不被持久化到输出流中。当对象被反序列化时,被transient修饰的字段将不会被恢复其原始值,而是会被设置为该类型的默认值(例如,对于引用类型,默认值为null)。

transient关键字的作用

  1. 序列化忽略transient关键字告诉Java序列化机制在序列化时忽略该字段。
  2. 节省存储空间:对于那些不需要持久化的字段,使用transient可以避免不必要的序列化和反序列化,从而节省存储空间。
  3. 保护敏感数据:对于包含敏感信息的字段,使用transient可以防止这些信息被意外地序列化到磁盘或其他持久化存储中。

下面用一个简单的示例,演示了如何使用transient关键字:

import java.io.*;

public class Employee implements Serializable {
    private String name;
    private transient int salary; // 不被序列化
    private String department;

    public Employee(String name, int salary, String department) {
        this.name = name;
        this.salary = salary;
        this.department = department;
    }

    // Getter and Setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", department='" + department + '\'' +
                '}';
    }
}

class SerializationExample {
    public static void main(String[] args) {
        try {
            // 创建 Employee 对象
            Employee emp = new Employee("John Doe", 50000, "Engineering");

            // 序列化
            FileOutputStream fos = new FileOutputStream("employee.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(emp);
            oos.close();

            // 反序列化
            FileInputStream fis = new FileInputStream("employee.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Employee deserializedEmp = (Employee) ois.readObject();
            ois.close();

            // 输出反序列化后的对象
            System.out.println(deserializedEmp);

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

运行上述代码时的输出:

Employee{name='John Doe', salary=0, department='Engineering'}

代码说明

  1. Employee 类

    • Employee 类实现了Serializable接口,使其可以被序列化。
    • salary 字段被标记为transient,意味着它不会被序列化到文件中。
  2. 序列化和反序列化

    • 创建了一个 Employee 对象,并将其序列化到文件 employee.ser 中。
    • 从文件中反序列化 Employee 对象。
    • 注意到 salary 字段在反序列化后被设置为默认值 0

所以transient关键字可以用来控制哪些字段应该被序列化,这对于保护敏感信息或节省存储空间都非常有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值