transient 关键字
Java语言关键字,在对对象进行持久化存储时,用transient进行修饰的变量不参与序列化处理
序列化
将对象写入到IO流中,以便于存储与磁盘或者是通过网络进行传播,java对象的序列化可以通过实现Serializable或者Externalizable就可以表明该类可以被序列化
transient
当对象进行序列化操作时,如果它的某个成员变量我们不希望或者不必要进行序列化时,可在该变量前面加上transient关键字进行修饰 例如用户密码我们不希望它被存储于磁盘中就可以对password变量用transient关键字进行修饰
java
public class User implements Serializable {
private String username;
private transient String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
jdk序列化
java
public class TransientTest {
public static void main(String[] args) {
User user = new User(){{
setUsername("boss");
setPassword("kuba");
}};
System.out.println("序列化前:" + user.toString());//序列化前:User{username='boss', password='kuba'}
ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(user);
Object obj = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray())).readObject();
System.out.println("序列化后:" + obj.toString());//序列化后:User{username='boss', password='null'}
}
}
json序列化
java
public class TransientTest {
public static void main(String[] args) {
User user = new User(){{
setUsername("boss");
setPassword("kuba");
}};
//Jackson进行序列化
System.out.println(new ObjectMapper().valueToTree(user).toString());//序列化结果为:{"username":"boss","password":"kuba"}
//Fastjson进行序列化
System.out.println(JSON.toJSONString(user));//序列化结果为:{"username":"boss"}
//Gson进行序列化
System.out.println(new Gson().toJson(user));//序列化结果为:null
User user2 = new User();
user2.setUsername("boss");
user2.setPassword("kuba");
//Gson进行序列化
System.out.println(new Gson().toJson(user2));//序列化结果为:{"username":"boss"}
}
}
注:不要使用双大括号进行初始化,Gson进行序列化会失效,即使后面又对其进行重新赋值也不可以,还是会失效,原因是Gson不可以对匿名内部类进行序列化操作,而双大括号形式的类初始化就是使用的匿名内部类的方式