用java
这么久,发现竟然不知道transient
关键字的作用
总的来说:transient
修饰的关键字不会被序列化
一、序列化和反序列化
名词解释
- 序列化:把
java
对象写入到I/O
流 ,即把java
对象转换为字节序列,并将字节序列保存在磁盘上,或通过网络传输 - 反序列化:从
I/O
流中恢复对象,即把得到的字节序列恢复成java
对象
序列化的方法
实现序列化有两种方法:实现Serializable
接口或Externalizable
接口
二、transient
的作用
- 一旦变量被
transient
修饰,变量不再是对象持久化的一部分,该变量在反序列化后也无法获得 transient
关键字只能修饰变量,不能修饰方法和类- 一个静态变量不管是否被
transient
修饰,均不能被序列化
举个例子,User
类序列化,password
使用transient
修饰,代码如下:
public class TransientTest {
public static void main(String[] args) {
User user = new User();
user.setUsername("zhangsan");
user.setPassword("123");
System.out.println("---------序列化前读取---------");
System.out.println(user.toString());
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("C:/a.txt"));
out.writeObject(user);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("C:/a.txt"));
user = (User) in.readObject();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("---------序列化后读取---------");
System.out.println(user.toString());
}
}
class User implements Serializable {
private String username;
private transient String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
打印结果:
---------序列化前读取---------
User{username='zhangsan', password='123'}
---------序列化后读取---------
User{username='zhangsan', password='null'}
可以看到,字段password
在反序列化过程中,没有被读取到