transient

transient 是 Java 语言中的一个关键字,用于修饰对象的属性。它的主要作用是在序列化过程中排除该属性,避免将其序列化到流中。这对于避免不必要的序列化数据、保护敏感信息或减小序列化数据体积等场景非常有用。

transient 的作用

  1. 排除序列化属性

    • 当一个对象被序列化(例如,通过 ObjectOutputStream 进行序列化)时,transient 修饰的属性不会被序列化到输出流中。这意味着在反序列化过程中,这些属性的值会被丢失,恢复后的对象中这些属性的值是默认值(如 null0false 等)。
  2. 保护敏感数据

    • 对于一些敏感信息(如密码、私人数据等),使用 transient 可以防止这些数据被序列化到文件中或在网络上传输,从而增加安全性。
  3. 优化序列化性能

    • 如果某些属性在序列化时不需要被保存,使用 transient 可以减小序列化数据的大小,从而提高序列化和反序列化的性能。

示例

1. 基本示例
java 复制代码
import java.io.*;

class User implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String username;
    private transient String password; // 这个属性不会被序列化

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

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

public class TransientExample {
    public static void main(String[] args) {
        User user = new User("john_doe", "password123");

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

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

解释

  • 在这个示例中,User 类实现了 Serializable 接口。
  • password 属性被标记为 transient,所以在序列化和反序列化过程中,password 属性不会被保存和恢复。
  • 当你运行这个程序并查看反序列化后的 User 对象时,你会发现 password 属性为 null,因为它没有被序列化。
2. 应用场景

敏感数据保护

java 复制代码
import java.io.*;

class SensitiveData implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private String sensitiveInfo;
    private transient String securityToken; // 不序列化的敏感数据

    public SensitiveData(String sensitiveInfo, String securityToken) {
        this.sensitiveInfo = sensitiveInfo;
        this.securityToken = securityToken;
    }

    @Override
    public String toString() {
        return "SensitiveData{sensitiveInfo='" + sensitiveInfo + "', securityToken='" + securityToken + "'}";
    }
}

public class SensitiveDataExample {
    public static void main(String[] args) {
        SensitiveData data = new SensitiveData("user_info", "secret_token");

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

        // 反序列化对象从文件
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("sensitiveData.ser"))) {
            SensitiveData deserializedData = (SensitiveData) ois.readObject();
            System.out.println(deserializedData);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

解释

  • SensitiveData 类包含一个 transientsecurityToken 属性,这表示在序列化时不会保存这个敏感信息。
  • 反序列化后,securityToken 将会是 null,从而保护了这个敏感数据不被序列化到持久化存储中。

总结

  • transient 关键字用于标记在序列化过程中需要排除的属性。
  • 它用于保护敏感数据、优化序列化性能以及避免不必要的数据保存。
  • 在序列化和反序列化过程中,transient 修饰的属性会被忽略,恢复时这些属性的值将会是默认值或 null
相关推荐
兔兔爱学习兔兔爱学习15 分钟前
Spring Al学习7:ImageModel
java·学习·spring
lang201509281 小时前
Spring远程调用与Web服务全解析
java·前端·spring
m0_564264182 小时前
IDEA DEBUG调试时如何获取 MyBatis-Plus 动态拼接的 SQL?
java·数据库·spring boot·sql·mybatis·debug·mybatis-plus
崎岖Qiu2 小时前
【设计模式笔记06】:单一职责原则
java·笔记·设计模式·单一职责原则
Hello.Reader2 小时前
Flink ExecutionConfig 实战并行度、序列化、对象重用与全局参数
java·大数据·flink
熊小猿3 小时前
在 Spring Boot 项目中使用分页插件的两种常见方式
java·spring boot·后端
paopaokaka_luck3 小时前
基于SpringBoot+Vue的助农扶贫平台(AI问答、WebSocket实时聊天、快递物流API、协同过滤算法、Echarts图形化分析、分享链接到微博)
java·vue.js·spring boot·后端·websocket·spring
老华带你飞3 小时前
机器人信息|基于Springboot的机器人门户展示系统设计与实现(源码+数据库+文档)
java·数据库·spring boot·机器人·论文·毕设·机器人门户展示系统
notion20253 小时前
Adobe Lightroom Classic下载与安装教程(附安装包) 2025最新版详细图文安装教程
java·数据库·其他·adobe
rengang664 小时前
351-Spring AI Alibaba Dashscope 多模型示例
java·人工智能·spring·多模态·spring ai·ai应用编程