java序列化之-static|transient 修飾的字段能否被序列化?

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

歡迎關注微信公衆號  【阿龍學堂】,更多編程基礎知識及機器學習學習內容

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章