demo中用戶端和服務端的hessian版本都是4.0.7,下面是用戶端向伺服器端發送的hessian調用及序列化參數的二進制資料,這些資料作為Http Post請求的資料部分傳遞給了伺服器端。

99 2 0 109 0 3 115 97 121 77 116 0 20 104 101 115 115 105 97 110 46 84 114 97 100 101 73 116 101 109
68 116 111 83 0 6 97 109 111 117 110 116 77 116 0 20 106 97 118 97 46 109 97 116 104 46 66 105 103 68
101 99 105 109 97 108 83 0 5 115 99 97 108 101 73 0 0 0 0 83 0 6 105 110 116 86 97 108 78 122 122 122
Hessian被稱為二進制協定(差別于類似Http的文本協定),是因為hessian調用會被轉換為類似上面的位元組流,伺服器端需要能夠解析這個位元組流,是以位元組流的形成和解析就要遵循hessian協定。特别的hessian同樣定義了自己的序列化協定,并沒有采用java的序列化機制。與其相比,hessian序列化簡單、形成的位元組流更加的精簡。
下面我們先簡單翻譯下上面的位元組流,大緻是這個樣子:

'c' 2 0 'm' 0 3 's' 'a' 'y' 'M' 't' 0 20 'h' 'e' 's' 's' 'i' 'a' 'n' '.' 'T' 'r' 'a' 'd' 'e' 'I' 't' 'e' 'm' 'D' 't' 'o'
'S' 0 6 'a' 'm' 'o' 'u' 'n' 't' 'M' 't' 0 20 'j' 'a' 'v' 'a' '.' 'm' 'a' 't' 'h' '.' 'B' 'i' 'g' 'D' 'e' 'c' 'i' 'm' 'a'
'l' 'S' 0 5 's' 'c' 'a' 'l' 'e' 'I' 0 0 0 0 'S' 0 6 'i' 'n' 't' 'V' 'a' 'l' 'N' 'z' 'z' 'z'
上面隻不過是将一些asii位元組碼翻譯為了字元,還是不夠清晰,下面就清楚些了,這就是按照Hessian協定進行的一次簡單遠端調用,意思是此為2.0的rpc,要調用遠端service的say方法,方法的參數為hessian.TradeItemDto對象,這個對象有一個字段amount,類型是java.math.BigDecimal類型,amount.scale=0,amount.intVal=null,也就是說amount=0。相當于調用遠端service.say(tradeItemDto),而tradeItemDto.amount=0,這裡其實是有問題的,demo中傳遞的是2999,而這裡确變為了0,這個問題暫時還沒弄清楚。

c 2 0
m 0 3 say
M t 0 20 hessian.tradeItemDto
S 0 6 amount
M t 0 20 java.math.BigDecimal
S 0 5 scale
I 0 0 0 0
S 0 6 intVal
N
z
z
z
下面是伺服器端傳回給用戶端的位元組流

72 2 0 82 10 72 101 108 108 111 32 50 57 57 57

'H' 2 0 'R' 10 'H' 'e' 'l' 'l' 'o' ' ' '2' '9' '9' '9'
翻譯一下,意思是說,hessian協定是2.0版本,這是一個對遠端調用的Reply,傳回的是一個長度為10的字元串"Hello 2999"。包括上面的位元組流和這裡其實demo中傳回的是"H 2 0 R 7 Hello 0",因為用戶端傳過來的就是tradeItemDto.amount=0,下面結果是經過我修改的,是應該傳回的結果。

H 2 0
R
10 Hello 2999
在demo裡面遇到一個問題,現象是參數tradeItemDto.amount是2999,事實序列化成的位元組流裡是0, 那個問題貌似是因為序列化出了問題,這個還要在研究下在後面在談這個問題。
HessianProxyFactory裡可以設定一些标志,比如是否支援方法重載setOverloadEnabled,設定讀逾時setReadTimeout,設定連接配接逾時setConnectTimeout,設定Hessian 2.0請求setHessian2Request,設定Hessian 2.0 Reply setHessian2Reply,預設是1.0請求,2.0 Reply。上面的Demo中就是1.0請求,2.0Reply