六 序列化和反序列化(物件流)

2022-09-17 21:33:25 字數 4137 閱讀 9042

1、什麼是序列化與反序列化?

序列化:指把堆記憶體中的 j**a 物件資料,通過某種方式把物件儲存到磁碟檔案中或者傳遞給其他網路節點(在網路上傳輸)。這個過程稱為序列化。通俗來說就是將資料結構或物件轉換成二進位制串的過程

反序列化:把磁碟檔案中的物件資料或者把網路節點上的物件資料,恢復成j**a物件模型的過程。也就是將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程

2、為什麼要做序列化?

①、在分布式系統中,此時需要把物件在網路上傳輸,就得把物件資料轉換為二進位制形式,需要共享的資料的 j**abean 物件,都得做序列化。

②、伺服器鈍化:如果伺服器發現某些物件好久沒活動了,那麼伺服器就會把這些記憶體中的物件持久化在本地磁碟檔案中(j**a物件轉換為二進位制檔案);如果伺服器發現某些物件需要活動時,先去記憶體中尋找,找不到再去磁碟檔案中反序列化我們的物件資料,恢復成 j**a 物件。這樣能節省伺服器記憶體。

3、j**a 怎麼進行序列化?

①、需要做序列化的物件的類,必須實現序列化介面:j**a.lang.serializable 介面(這是乙個標誌介面,沒有任何抽象方法),j**a 中大多數類都實現了該介面,比如:string,integer

②、底層會判斷,如果當前物件是 serializable 的例項,才允許做序列化,j**a物件 instanceof serializable 來判斷。

③、在 j**a 中使用物件流來完成序列化和反序列化

objectoutputstream:通過 writeobject()方法做序列化操作

objectinputstream:通過 readobject() 方法做反序列化操作

第一步:建立乙個 j**abean 物件12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

publicclasspersonimplementsserializable

publicvoidsetname(string name)

publicintgetage()

publicvoidsetage(intage)

@override

publicstring tostring()

publicperson(string name,intage)

}

第二步:使用 objectoutputstream 物件實現序列化12

3456

//在根目錄下新建乙個 io 的資料夾

outputstream op =newfileoutputstream("io"+file.separator+"a.txt");

objectoutputstream ops =newobjectoutputstream(op);

ops.writeobject(newperson("vae",1));

ops.close();

我們開啟 a.txt 檔案,發現裡面的內容亂碼,注意這不需要我們來看懂,這是二進位制檔案,計算機能讀懂就行了。

錯誤一:如果新建的 person 物件沒有實現 serializable 介面,那麼上面的操作會報錯:

第三步:使用objectinputstream 物件實現反序列化

反序列化的物件必須要提供該物件的位元組碼檔案.class12

3456

7inputstream in =newfileinputstream("io"+file.separator+"a.txt");

objectinputstream os =newobjectinputstream(in);

bytebuffer =newbyte[10];

intlen = -1;

person p = (person) os.readobject();

system.out.println(p);//person [name=vae, age=1]

os.close();

問題1:如果某些資料不需要做序列化,比如密碼,比如上面的年齡?

解決辦法:在字段面前加上 transient12

privatestring name;//需要序列化

transientprivateintage;//不需要序列化

那麼我們在反序列化的時候,列印出來的就是person [name=vae, age=0],整型資料預設值為 0 

問題2:序列化版本問題,在完成序列化操作後,由於專案的公升級或修改,可能我們會對序列化物件進行修改,比如增加某個字段,那麼我們在進行反序列化就會報錯:

解決辦法:在 j**abean 物件中增加乙個 serialversionuid 字段,用來固定這個版本,無論我們怎麼修改,版本都是一致的,就能進行反序列化了

1privatestaticfinallongserialversionuid = 8656128222714547171l;

物件序列化和反序列化

物件序列化有很多方式,在這裡我只講用xml序列化,我們從開始序列化講起,首先,你要在需要被序列化的類前面寫上 serializable 表示該類的例項可以被序列化,其次在要執行序列化的 去中寫入using system.xml.serialization xml序列化必須的 using system...

物件序列化和反序列化

c 提供三種序列化的方法,與此有關的三個類分別是 binaryserialize soapserialize xmlserialize 以二進位制的序列化和反序列化為例,先建立乙個實體類product。1 serializable 2public class product316 17public ...

物件序列化 反序列化

必須新增引用 using system.io using system.runtime.serialization using system.runtime.serialization.formatters.binary 方法 region 物件序列化 物件序列化 任意物件 字串 public st...