09_transient关键字的作用

如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。

换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。

### transient关键字作用 在Java编程中,`transient` 是一个修饰符关键字,专门用于标记类的成员变量。其主要作用是在序列化过程中指示编译器忽略这些被标记的变量[^1]。 具体来说,在对象进行序列化(即将对象的状态转换成可以存储或传输的形式)时,任何被 `transient` 关键字标记过的字段都将不会被保存到磁盘文件或其他持久性介质上;同样地,在反序列化期间也不会恢复这些字段的数据。这使得开发者能够控制哪些属性不应该成为对象状态的一部分,从而保护敏感信息或者优化性能[^4]。 #### 使用场景举例 考虑如下情况: - **隐私数据**:比如用户的密码、信用卡号等不应随同业务逻辑一起存入数据库; - **临时计算结果**:某些只存在于内存里的中间值没有必要写入外部存储设备; - **资源句柄**:像文件指针之类的系统级资源无法也不应通过常规方式复制给另一个进程实例。 下面给出一段简单的代码来展示如何定义并运用带有 `transient` 修饰符的成员变量: ```java import java.io.*; class User implements Serializable { private String username; // 敏感信息不需要参与序列化过程 private transient String password; public User(String name, String pwd){ this.username = name; this.password = pwd; } @Override public String toString(){ return "User{" + "username='" + username + '\'' + ", password='" + (password != null ? "exists" : "null") + '\'' + '}'; } } public class Main { public static void main(String[] args) throws IOException, ClassNotFoundException { User user = new User("Alice", "secret"); System.out.println("Before serialization:"); System.out.println(user); try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos)) { oos.writeObject(user); byte[] bytes = bos.toByteArray(); try(ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes))) { User deserializedUser = (User)ois.readObject(); System.out.println("\nAfter deserialization:"); System.out.println(deserializedUser); } } catch(Exception e){ throw new RuntimeException(e); } } } ``` 运行上述程序会发现,尽管原始的对象包含了用户名和密码两个部分的信息,但在经过序列化再反序列化之后得到的新对象里只有用户名保留了下来,而密码已经被置为了 `null` —— 这正是由于设置了 `transient` 所致的结果[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值