简述transient的作用用途
答案:1 悬赏:30 手机版
解决时间 2021-11-24 04:15
- 提问者网友:niaiwoma
- 2021-11-23 20:26
简述transient的作用用途
最佳答案
- 五星知识达人网友:执傲
- 2021-11-23 21:39
1、作用:在对象序列化的时候,有些变量不需要序列化,比如密码等,可以使用transient关键字来解决这个问题,transient修饰的变量不会被序列化。
2、用法:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//Serializable接口没有任何需要实现的方法,实现这个接口是为了声明这个对象可以序列化
public class TransientDemo implements Serializable{
private static final long serialVersionUID = 1L;
String name;
//用了transient这个关键字,这个字段就不会被序列化了
transient String password;
public TransientDemo(String name, String password) {
this.name = name;
this.password = password;
}
@Override
public String toString() {
return name + ":" + password;
}
public static void main(String[] args) {
TransientDemo td = new TransientDemo("Yinyan", "love");
try{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("log.txt"));
oos.writeObject(td);
oos.close();
}catch(Exception e){
e.printStackTrace();
}
try{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("log.txt"));
TransientDemo td2 = (TransientDemo) ois.readObject();
System.out.println(td2);
}catch(Exception e){
e.printStackTrace();
}
}
}
输出结果为:
这段代码创建了一个对象,然后序列化这个对象,保存到log.txt这个文件中,在从log.txt这个文件读取出对象。我们发现name字段内容正常,password字段却为空。这是因为,保底保存密码风险很大,所以我们把password字段定义为不需要序列化。
另外需要说明一点,如果类实现的是Externalizable这个接口,在writeExternal方法内部手动序列化password字段的话,transient 这个关键字是不会起作用的。
2、用法:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//Serializable接口没有任何需要实现的方法,实现这个接口是为了声明这个对象可以序列化
public class TransientDemo implements Serializable{
private static final long serialVersionUID = 1L;
String name;
//用了transient这个关键字,这个字段就不会被序列化了
transient String password;
public TransientDemo(String name, String password) {
this.name = name;
this.password = password;
}
@Override
public String toString() {
return name + ":" + password;
}
public static void main(String[] args) {
TransientDemo td = new TransientDemo("Yinyan", "love");
try{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("log.txt"));
oos.writeObject(td);
oos.close();
}catch(Exception e){
e.printStackTrace();
}
try{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("log.txt"));
TransientDemo td2 = (TransientDemo) ois.readObject();
System.out.println(td2);
}catch(Exception e){
e.printStackTrace();
}
}
}
输出结果为:
这段代码创建了一个对象,然后序列化这个对象,保存到log.txt这个文件中,在从log.txt这个文件读取出对象。我们发现name字段内容正常,password字段却为空。这是因为,保底保存密码风险很大,所以我们把password字段定义为不需要序列化。
另外需要说明一点,如果类实现的是Externalizable这个接口,在writeExternal方法内部手动序列化password字段的话,transient 这个关键字是不会起作用的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯