transient这个关键字我们一般很少用到,但是我再阅读JDK源码的时候常常看到这个关键字,在这里总结一些这个关键字的用法。
- 这个关键字主要是用于对象的序列化的。transient是字段类型修饰符,只能修饰变量,而不能修饰方法和类。
- 被transient关键字修饰的变量不能再被序列化,静态变量不管是否被transient修饰,均不能被序列化。
- 一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。也可以认为在将持久化的对象反序列化后,被transient修饰的变量将按照普通类成员变量一样被初始化。
把一个对象的表示转化为字节流的过程称为序列化,(serialization),从字节流中把对象重建出来称为反序列化,(deserialization)。transient 为不应被串行化的数据提供了一个语言级的标记数据方法。
下面看一个例子:
待序列化的对象
package test;
import java.io.Serializable;
import java.util.Date;
/**
* Created by louyuting on 16/12/20.
*/
public class Obj implements Serializable {
private static final long serialVersionUID = -5836283489677344417L;
public transient int classValue = 10;
public transient Date date = new Date();
public transient static int staticValue = 10;
private int te;
public int getClassValue() {
return classValue;
}
public void setClassValue(int classValue) {
this.classValue = classValue;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public static int getStaticValue() {
return staticValue;
}
public static void setStaticValue(int staticValue) {
Obj.staticValue = staticValue;
}
}
运行对象
@org.junit.Test
public void mainnnn() {
Obj o = new Obj();
o.setDate(new Date());
o.setClassValue(11);
o.setTe(333);
Obj.staticValue=20;
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("hello")));
out.writeObject(o);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
Obj o1=null;
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("hello")));
o1 = (Obj)in.readObject();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(o1.classValue);
System.out.println(o1.getTe());
System.out.println((o1.date == null ? "date is null"
: "date is not null"));
}
输出: