Hessian 的字段序列化小記

2021-08-26 22:40:51 字數 2270 閱讀 3050

hessian 的字段序列化小記

一背景:

今天線上碰到乙個問題,在通過hessian的反序列化的時候失敗了。

簡單檢視了下原因,是因為服務端和客戶端依賴的bean包版本不一致導致的。

二 具體分析:

client --- > commons-entity 

sever  ---  > commons-entity 

做了依賴倒置處理,服務端及客戶端都持有服務介面及物件的包。

commons-entity 存在兩個版本:服務端版本(新版本)及客戶端版本(舊版本)。兩個版本之間區別在於對於某個欄位的型別做了改變。

下面就分析下不同場景下hessian的處理結果。

1.服務端 欄位a:date       客戶端 欄位a:timestamp  反序列化出錯

2.服務端 欄位a:timestamp  客戶端 欄位a:date       序列化正常

因為date是timestamp的父類,故在反序列化時,向上轉型是沒有問題的。反之向下轉型就存在問題。所以1就會出問題,因為1需要將date轉化成timestamp型別。

結論:在反序列化時,若是客戶端物件是服務端物件的父類,那麼不會失敗。

tip:對於日期型別的物件還是建議定義為long型別。

三 擴充套件

以上就是我們具體的故障情況,那麼擴充套件的來測試下一下兩種情況是否存在問題。

場景一:

服務端 存在欄位a       客戶端 無欄位a    反序列化正常

結論:反序列化時依賴於客戶端所持有的物件,對服務傳遞位元組流進行處理的。不是依賴於服務端的物件處理。這樣也很容易理解。因為是客戶端需要生成物件。

場景二:

服務端 無欄位a         客戶端 存在欄位a  反序列化正常

結論:反序列化是先解析客戶端物件,然後拿著該物件的屬性到服務端的位元組流中查詢,若是存在則生成,若是不存在則忽略該屬性的設定,設定為預設值。

總結:在客戶端反序列化時候,從服務端中取,若是取不到,則不管,設定為預設值。不管服務端屬性是否多餘客戶端,一切以客戶端為準。

四 具體實踐**

附乙個hessian的簡單使用的核心**:

}ipersonserviceservlet的實現:

public class ipersonserviceservlet extends hessianservlet implements ipersonservice 

@override

public void hello()

@override

public iperson gerperson()

}

org.mortbay.jetty

jetty

6.1h.14

com.inter12.hesian

common-inte***ce

1.0.0

hessian

hessian

3.0.1

client:

}

hessian

hessian

3.0.1

com.inter12.hesian

common-inte***ce

1.0.0

五 寫在最後

先占個坑,以後再深挖hessian的協議。

MsgPack和Hessian序列化對比

兩者的區別 hessian序列化的時候,會寫入欄位名稱,然後字段值,類似map。msgpack序列化的時候,不寫入欄位名字,會按字段順序寫入值,類似陣列。hessian產生的資料報較大,msgpack產生的資料報較小。網路傳輸資料更小。序列化中hessian的效能較差 msgpack效能更佳,相當於...

序列化(序列化)

原書上翻譯為序列化,msdn翻譯為序列化 作用 當需要儲存,或者網路傳輸 remoting時,資料 物件或值 需要序列化 類似於打包傳輸檔案。system.serializableattribute 序列化是指儲存和獲取磁碟檔案 記憶體或其他地方中的物件。在序列化時,所有的例項資料都儲存到儲存介質上...

序列化(模型序列化 序列化巢狀)

from rest framework import serializers from meituan.models import merchant,class merchantserializer serializers.modelserializer class meta model merch...