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...