transient的使用

package javatest;


import java.io.FileInputStream; 
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class transientDemo {
public static void main(String[] args) throws Exception{
User user=new User();
user.setName("yanfang");
user.setPwd("123456");
FileOutputStream fos=new FileOutputStream("d:/user.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(user);
oos.flush();
oos.close();
fos.close();

ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/user.txt"));
User users=(User)ois.readObject();
ois.close();

System.out.println(users);

}
}


class User implements Serializable{
 
private static final long serialVersionUID = -7792740442867566139L;
private String name;
private transient String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [name=" + name + ", pwd=" + pwd + "]";
}

}


输出结果:

User [name=yanfang, pwd=null]


密码字段为null,说明反序列化时根本没有从文件中获取到信息。



package javatest;


import java.io.FileInputStream; 
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class transientDemo {
public static void main(String[] args) throws Exception{
User user=new User();
user.setName("yanfang");
user.setPwd("123456");
FileOutputStream fos=new FileOutputStream("d:/user.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(user);
oos.flush();
oos.close();
fos.close();

//反序列化后类中static型变量name的值为当前JVM中对应static变量的值
user.setName("static name");
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("d:/user.txt"));
User users=(User)ois.readObject();
ois.close();

System.out.println(users);

}
}


class User implements Serializable{
 
private static final long serialVersionUID = -7792740442867566139L; 
private static String name;
private transient String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [name=" + name + ", pwd=" + pwd + "]";
}



}


结果:User [name=static name, pwd=null]

总结:

1.序列化是针对一个对象来说的,但静态成员不归属对象,属于类本身。 所以这样还说,你让不让它瞬态都没意义,不必讨论它。

2.一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。换句话说,这个字段的生命周期仅存于调用者的内存中。

3.transient关键字只能修饰变量,而不能修饰方法和类。为什么要不被序列化呢,主要是为了节省存储空间

猜你喜欢

转载自blog.csdn.net/weixin_40839342/article/details/80838787