简述serializable和transient关键字作用

本文介绍了序列化的基本概念及应用场景,并重点讲解了如何通过transient关键字实现非序列化,以保护敏感信息不被序列化。

一、序列化使用场景

对象的序列化:目的:将一个具体的对象进行持久化,写入到硬盘上。(注意:静态数据不能被序列化,因为静态数据不在堆内存中,而是在静态方法区中)

Serializable用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。

二、非序列化使用场景

如何将非静态的数据不进行序列化?用transient 关键字修饰此变量即可。使用场景:为了安全起见,有时候我们不需要在网络间

传输一些数据(如身份证号码,密码,银行卡号等)

三、代码体现

package com.wanghang.one;

import java.io.Serializable;

/**
 * 序列化与非序列化
 *
 * @author Hang.W
 * @version 1.0, 2017-02-10 01:30:12
 */
class Person implements Serializable {
	
	// UID
	private static final long serialVersionUID = 42L;
	
	// 用transient修饰后name将不会进行序列化
	private transient String name;
	
	public int age;

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
}

四、transient关键字注意事项

1、transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。
2、被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
3、一旦变量被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、付费专栏及课程。

余额充值