以前寫過一篇序列化相關的文章,今天要講的這個文件自transient也是跟序列化有關係的。可是,挺多人沒有了解過該關鍵字甚至是不知道該關鍵字的存在。java
在Java中,當一個類實現了java.io.Serializable接口,即代表了該類能夠被序列化。咱們能夠把該類的屬性序列化而後保存在外部,或者跟另一個jvm進行數據傳遞。可是,咱們是否想過,若是一個類包含隱私信息,如用戶的密碼等,那麼這個屬性就不可以被序列化到外部。固然,咱們能夠在序列化以前手動set該值爲null,可是最優雅的作法就是使用transient關鍵字。編程
在咱們不想序列化到外部的屬性前面加上transient關鍵字,該屬性將不會被序列化。app
假設咱們有User對象以下:jvm
@Data
public class User implements Serializable {
private String username;
private transient String password;
}
複製代碼
經過序列化工具類序列化和反序列化:工具
@Test
public void test() {
User user = new User();
user.setUsername("happyjava");
user.setPassword("123456");
System.out.println("序列化以前:" + user.toString());
byte[] serialize = SerializationUtils.serialize(user);
User newUser = SerializationUtils.deserialize(serialize);
System.out.println("反序列化:" + newUser);
}
複製代碼
運行結果以下:測試
經過結果能夠看到,反序列化以後沒有存在password字段,這反向的證實了序列化的時候沒有把password參與到序列化中去。這正是transient關鍵字的用處。spa
可能有讀者會想到,若是靜態屬性加上transient會怎麼樣?反序列化回來以後是否是該類的靜態屬性就編程null了?下面經過代碼來驗證下:code
給User添加屬性count:cdn
private transient static int count;
複製代碼
這是一個靜態屬性。對象
先把該屬性設置爲10,而後序列化、反序列化一個類,再查看該靜態屬性:
@Test
public void test() {
User user = new User();
User.setCount(10);
user.setUsername("happyjava");
user.setPassword("123456");
System.out.println("序列化以前:" + user.toString());
System.out.println("user count:"+User.getCount());
byte[] serialize = SerializationUtils.serialize(user);
User newUser = SerializationUtils.deserialize(serialize);
System.out.println("反序列化:" + newUser);
System.out.println("user count:" + User.getCount());
}
複製代碼
輸出結果以下:
從結果看,靜態屬性沒有發生改變。其實,無論有沒有加transient關鍵字,靜態屬性都不會被序列化。
1)一旦變量被transient修飾,變量將再也不是對象持久化的一部分。
2)transient關鍵字只能修飾變量,而不能修飾方法和類。
3)被transient關鍵字修飾的變量再也不能被序列化,一個靜態變量無論是否被transient修飾,均不能被序列化。