使用场景:当一个类实现了Serilizable接口,那么这个类的所有属性和方法都可以被序列化。但有时,我们不希望有些属性被序列化,那么我们可以用transient关键字修饰这个属性。
public class User implements Serializable{
private static final long serialVersionUID = 9112505189588127047L;
private String username;
private transient String passwd;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
注:
- 一个静态变量不管是否被transient修饰,均不能被序列化。
- transient关键字只能修饰变量,而不能修饰方法和类。
- 局部变量是不能被transient关键字修饰的。
- transient关键字修饰的变量如果是用户自定义类变量,则该类需要实现Serializable接口。
例外情况:
对象的序列化可以通过实现两种接口来实现:若实现的是Serializable接口,则所有的序列化将会自动进行;若实现的是Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关。
public class ExternalizableTest implements Externalizable {
private transient String content = "闪光灯和规范化";
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(content);
}
@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
content = (String) in.readObject();
}
public static void main(String[] args) throws Exception {
ExternalizableTest et = new ExternalizableTest();
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(
new File("test.txt")));
out.writeObject(et); //序列化
ObjectInput in = new ObjectInputStream(new FileInputStream(new File(
"test.txt")));
et = (ExternalizableTest) in.readObject(); //反序列化
System.out.println(et.content);
out.close();
in.close();
}
}
输出结果: