1、結論
static
和 transient
修飾的字段是不會被序列化的。
2、驗證
2.1、創建類並增加兩個字段
class Wanger implements Serializable {
private static final long serialVersionUID = -2095916884810199532L;
private String name;
private int age;
public static String pre = "沉默";
transient String meizi = "王三";
@Override
public String toString() {
return "Wanger{" + "name=" + name + ",age=" + age + ",pre=" + pre + ",meizi=" + meizi + "}";
}
}
2.2、測試類
測試類中打印序列化前和反序列化後的對象,並在序列化後和反序列化前改變 static
字段的值。具體代碼如下:
// 初始化
Wanger wanger = new Wanger();
wanger.setName("王二");
wanger.setAge(18);
System.out.println(wanger);
// 把對象寫到文件中
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("chenmo"));){
oos.writeObject(wanger);
} catch (IOException e) {
e.printStackTrace();
}
// 改變 static 字段的值
Wanger.pre ="不沉默";
// 從文件中讀出對象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("chenmo")));){
Wanger wanger1 = (Wanger) ois.readObject();
System.out.println(wanger1);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
// Wanger{name=王二,age=18,pre=沉默,meizi=王三}
// Wanger{name=王二,age=18,pre=不沉默,meizi=null}
2.3、過程分析
1、序列化前,pre
的值爲“沉默”,序列化後,pre
的值修改爲“不沉默”,反序列化後,pre
的值爲“不沉默”,而不是序列化前的狀態“沉默”。爲什麼呢?因爲序列化保存的是對象的狀態,而 static
修飾的字段屬於類的狀態,因此可以證明序列化並不保存 static
修飾的字段。
2、序列化前,meizi
的值爲“王三”,反序列化後,meizi
的值爲 null
,而不是序列化前的狀態“王三”。爲什麼呢?transient
的中文字義爲“臨時的”(論英語的重要性),它可以阻止字段被序列化到文件中,在被反序列化後,transient
字段的值被設爲初始值,比如 int
型的初始值爲 0,對象型的初始值爲 null
。
ObjectStreamClass
中發現下面這樣的代碼:
private static ObjectStreamField[] getDefaultSerialFields(Class<?> cl) {
Field[] clFields = cl.getDeclaredFields();
ArrayList<ObjectStreamField> list = new ArrayList<>();
int mask = Modifier.STATIC | Modifier.TRANSIENT;
int size = list.size();
return (size == 0) ? NO_FIELDS :
list.toArray(new ObjectStreamField[size]);
}
注意關鍵詞:Modifier.STATIC | Modifier.TRANSIENT
2.4、驗證完畢
你慢慢品,你細品。。。
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
有問題請聯繫QQ:765120845
歡迎關注微信公衆號 【阿龍學堂】,更多編程基礎知識及機器學習學習內容