簡單來講序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化,流的概念這裏不用多說(就是I/O),咱們能夠對流化後的對象進行讀寫操做,也可將流化後的對象傳輸於網絡之間(注:要想將對象傳輸於網絡必須進行流化)!在對對象流進行讀寫操做時會引起一些問題,而序列化機制正是用來解決這些問題的!網絡
問題的引出:
如上所述,讀寫對象會有什麼問題呢?好比:我要將對象寫入一個磁盤文件然後再將其讀出來會有什麼問題嗎?別急,其中一個最大的問題就是對象引用!舉個例子來講:假如我有兩個類,分別是A和B,B類中含有一個指向A類對象的引用,如今咱們對兩個類進行實例化{ A a = new A(); B b = new B(); },這時在內存中實際上分配了兩個空間,一個存儲對象a,一個存儲對象b,接下來咱們想將它們寫入到磁盤的一個文件中去,就在寫入文件時出現了問題!由於對象b包含對對象a的引用,因此係統會自動的將a的數據複製一份到b中,這樣的話當咱們從文件中恢復對象時(也就是從新加載到內存中)時,內存分配了三個空間,而對象a同時在內存中存在兩份,想想後果吧,若是我想修改對象a的數據的話,那不是還要搜索它的每一份拷貝來達到對象數據的一致性,這不是咱們所但願的!
如下序列化機制的解決方案:
1.保存到磁盤的全部對象都得到一個序列號(1, 2, 3等等)
2.當要保存一個對象時,先檢查該對象是否被保存了。
3.若是之前保存過,只需寫入"與已經保存的具備序列號x的對象相同"的標記,不然,保存該對象
經過以上的步驟序列化機制解決了對象引用的問題!對象