java中序列化乙個物件儲存在檔案中的簡單過程

2021-08-19 10:10:24 字數 1374 閱讀 1235

public class student implements serializable

public student(int id, string name)

@override

public string tostring()

public int getid()

public void setid(int id)

public string getname()

public void setname(string name)

public string gethobby()

public void sethobby(string hobby)

}

第乙個測試方法:

public class test 

}

結果:student [id=2, name=麗日御茶子,***=女,hobby=吃吃吃]

student [id=3, name=麗日御茶子,***=男,hobby=玩玩玩]

student [id=3, name=麗日御茶子,***=男,hobby=null]

第二個測試:

第乙個程式已經執行完,且刪掉前面**,直接讀取

public class test 

}

結果:

student [id=3, name=麗日御茶子,***=女,hobby=null]

第一次測試結果:

從第乙個結果來看,第一次列印的是預設例項化後的結果

第二次對變數設定過後的列印也沒有什麼問題

第三次列印發現hobby變成了null

原因:transient修飾過的變數不參與序列化,string預設值是為null,數值則為0

第二次測試結果:

性別變成了女,id還是3,hobby是null

原因:id在序列化前已經被設定成3,序列化後該值被儲存了起來,再次讀取依舊是3,沒有執行構造方法,所以得出反序列化是不會執行構造方法的。

hobby因為是加了transient所以不參與序列化沒有被儲存起來。

***回到了原來的值女,而在第一次測試裡第三次列印的結果是男,因為第一次測試裡jvm並沒有停止,所以方法區里***的值被設定後確實變成了男,而靜態變數是不參與序列化的,所以第乙個測試程式裡讀取反序列化物件時,因為都是student類所以都使用同乙個位址上的值,而***這個位址上的值已經被改變,所以列印的結果也被改變。而第二次測試裡jvm已經重啟,原來方法區里的***的位址已經消失,在讀取反序列化物件時又會進行一次類載入,載入時就會按照student裡寫的static的預設值重新分配位址和預設值,所以讀取的結果就是原來的值了。

Java中物件序列化與反序列化

1.建立可序列化物件 public class student implements serializable public student string name,int age,int default1 public void addresscheck public string getname...

JAVA物件序列化,反序列化

理解序列化和反序列化對理解物件導向有很大的幫助。舉例如下,序列化格式自己定義 我們有兩個類,動物,人,人繼承動物。其中 人的屬性有 name 名稱 phonenum 手機號碼 等 人的方法有 serialize deserialize 動物的屬性有 mood 情緒 性別 等 動物的方法有 seria...

JAVA 物件序列化

概念 物件序列化,就是將乙個物件轉化為二進位制的資料流 方法 想要被序列化的物件,在定義該類時,必須實現serializable介面,或者實現externalizable介面 物件序列化實質是把物件的屬性進行序列化為二進位制資料流,方法則不管 因為物件直接只有屬性是有差異的 serializable...