IO流學習總結(下) 序列化 反序列化

2021-09-20 11:03:58 字數 2031 閱讀 4723

序列化目的:序列化一般是指把結構化的物件變成無結構的位元組流,便於儲存、傳輸

物件的序列化: 將記憶體中的物件直接寫入到檔案裝置中

物件的反序列化: 將檔案裝置中持久化的資料轉換為記憶體物件

序列化前提:如果物件需要被寫出到檔案上,那麼物件所屬的類必須要實現serializable介面。 serializable介面沒有任何的方法,是乙個標識介面而已。

重點:****objectinputstream是序列化 可以直接儲存乙個集合

序列化objectoutputstream 需要傳入乙個流 因為它本身不具備讀寫作用

serializable :標記介面 類繼承後不用實現 集合類都已經繼承了這個介面

變數如果是使用者自定義類變數,則該類需要實現serializable介面。

如果乙個類維護了另外乙個類的引用,那麼另外乙個類也需要實現serializable介面。

transient

介紹:如果乙個物件某個資料不想被序列化到硬碟上,可以使用關鍵字transient修飾

transient 是透明 意思就是說被它修飾的不會被序列化

transient關鍵字只能修飾變數,而不能修飾方法和類。

被transient關鍵字修飾的變數不再能被序列化,乙個靜態變數不管是否被transient修飾,均不能被序列化。

物件的反序列化建立物件的時候並不會呼叫到構造方法的

serialversionuid介紹:是用於記錄class檔案的版本資訊的,serialversionuid這個數字是通過乙個類的類名、成員、包名、工程名算出的乙個數字。

使用objectinputstream反序列化的時候,objeectinputstream會先讀取檔案中的serialversionuid,然後與本地的class檔案的serialversionuid進行對比,如果這兩個id不一致,那麼反序列化就失敗了。

如果序列化與反序列化的時候可能會修改類的成員,那麼最好一開始就給這個類指定乙個serialversionuid,如果一類已經指定的serialversionuid,然後

在序列化與反序列化的時候,jvm都不會再自己算這個class的serialversionuid了。

怎麼建立serialversionuid?

右擊類名就會提醒了

問:類的變數被transient關鍵字修飾以後將不能序列化了嗎?

答:物件的序列化可以通過實現兩種介面來實現,若實現的是serializable介面,則所有的序列化將會自動進行,若實現的是externalizable介面,則沒有任何東西可以自動序列化,需要在writeexternal方法中進行手工指定所要序列化的變數,這與是否被transient修飾無關。

class user implements serializable

public user(string username , string passwrod,int age,address address)

@override

public string tostring()

}public class demo3

//把檔案中的物件資訊讀取出來-------->物件的反序列化

public static void readobj() throws ioexception, classnotfoundexception

//定義方法把物件的資訊寫到硬碟上------>物件的序列化。

public static void writeobj() throws ioexception

}

注意:序列化不適用於靜態變數,因為靜態變數並不屬於物件的例項變數的一部分。靜態變數隨著類的載入而載入,是類變數。由於序列化只適用於物件。

基本資料型別可以被序列化

public class demo5

序列化流與反序列化流

序列化流 寫操作 將物件變成流資料進行傳輸,例如儲存在乙個檔案裡,在網路中傳輸。物件 流資料 objectoutputstream 反序列化流 讀操作 將檔案中的流物件資料或者網路中的流物件資料還原成物件。流資料 物件 objectinputstream 注意點 序列化物件要實現序列化介面 建立反序...

序列化反序列化

只要用到網路開發啊,就一定會用到序列化反序列化。1,自定義結構體 struct test int len int type char data 10 test data test buffer.缺點 明文,只支援基本型別,不支援變長結構 2,在1的基礎上,自定義乙個緩衝類,存放乙個訊息。把訊息寫入緩...

序列化反序列化

using system using system.collections.generic using system.io using system.linq using system.text using system.threading.tasks namespace 序列化反序列化 syste...