dubbo 序列化例項
最近在做CMS中excel資料批量錄入資料庫這個功能,遇到了dubbo序列化問題。這裡做總結。
先說一下java為何需要序列化:
1.Java序列化與反序列化
Java序列化是指把Java物件轉換為位元組序列的過程;而Java反序列化是指把位元組序列恢復為Java物件的過程。
2.為什麼需要序列化與反序列化
我們知道,當兩個程序進行遠端通訊時,可以相互發送各種型別的資料,包括文字、圖片、音訊、視訊等, 而這些資料都會以二進位制序列的形式在網路上傳送。那麼當兩個Java程序進行通訊時,能否實現程序間的物件傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話說,一方面,傳送方需要把這個Java物件轉換為位元組序列,然後在網路上傳送;另一方面,接收方需要從位元組序列中恢復出Java物件。
當我們明晰了為什麼需要Java序列化和反序列化後,我們很自然地會想Java序列化的好處。其好處一是實現了資料的持久化,通過序列化可以把資料永久地儲存到硬碟上(通常存放在檔案裡),二是,利用序列化實現遠端通訊,即在網路上傳送物件的位元組序列。
3.如何實現Java序列化與反序列化
1)JDK類庫中序列化API
java.io.ObjectOutputStream:表示物件輸出流
它的writeObject(Object obj)方法可以對引數指定的obj物件進行序列化,把得到的位元組序列寫到一個目標輸出流中。
java.io.ObjectInputStream:表示物件輸入流
它的readObject()方法源輸入流中讀取位元組序列,再把它們反序列化成為一個物件,並將其返回。
2)實現序列化的要求
只有實現了Serializable或Externalizable介面的類的物件才能被序列化,否則丟擲異常。
3)實現Java物件序列化與反序列化的方法
假定一個Student類,它的物件需要序列化,可以有如下三種方法:
方法一:若Student類僅僅實現了Serializable介面,則可以按照以下方式進行序列化和反序列化
ObjectOutputStream採用預設的序列化方式,對Student物件的非transient的例項變數進行序列化。
ObjcetInputStream採用預設的反序列化方式,對對Student物件的非transient的例項變數進行反序列化。
這一點詳見連結:http://blog.csdn.net/wangloveall/article/details/7992448/
在專案中,遇到問題是需要將檔案傳遞到另一個專案B,並呼叫B專案的服務對檔案進行解析和資料儲存。
這就涉及到上面說的程序通訊了。如果是map或list這類容器的傳遞,那很簡單,按照上面說的,只需要將容器中的
物件進行序列化處理就行了(實體類實現Serializable介面)。
可是現在傳遞的是檔案,如何處理呢?
原理是一樣的,將檔案也做“序列化處理”。步驟如下:
1、將file傳給本專案service,處理成inputStream;
2、在本專案中處理inputStream,將輸入流中的物件提取出來,放在map容器中。
3、將map容器傳給專案B,由於容器中的物件是能夠序列化的,所以傳遞沒有問題。
4、專案B的service讀取容器中的物件,進行驗證等業務操作。
中間的關鍵是第二條,他將無法序列化的檔案轉換成可以序列化的物件,進行傳遞,解決了不同專案間的通訊問題。