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关键字只能修饰变量,而不能修饰方法和类。为什么要不被序列化呢,主要是为了节省存储空间