摘要:就是默認的序列化器和反序列化器。最后,那為什么會到這一步呢發(fā)現(xiàn)拿到反序列化器后會執(zhí)行一個操作基本上就到這里了,最主要的原因還是方法,并不是很多博文說的。
????首先交代背景,前幾天遇到一個小bug,由于其他系統(tǒng)的一個DTO子類和父類有一個字段名重復了,所以導致我set的子類字段那邊拿不到值。改起來很簡單嘛,讓對面把子類的字段刪掉就好,但是拿不到值的原因讓我想了很久,很明顯是序列化和反序列化的過程中這個字段的值丟失了,但是到底是在哪一步呢?還是決定看看源碼給自己一個答案。
dubbo版本:2.6.7首先先確定協(xié)議和序列化的方式:
ok,dubbo協(xié)議,沒有配序列化方式,那再來找一下dubbo默認的序列化方式:
首先找到了這個包:
然后在Serialization接口(實現(xiàn)一些自定義序列化擴展用的)中發(fā)現(xiàn)了默認序列化的方式是hessian2
然后通過Hessian2Serialization的serialize方法和deserialize方法找到了Hessian2ObjectOutput、Hessian2ObjectInput這個兩個類,之后通過里面的writeObject方法和readObject方法,找到了這兩個類:JavaSerializer和JavaDeserializer。就是默認的序列化器和反序列化器。
首先我們來看序列化:
構(gòu)造方法:
我們看看他干了個什么事
首先檢查了有沒有writeReplace方法
然后把所有聲明的字段放到數(shù)組中遍歷,然后把除了transient和static修飾的字段放到ArrayList中去
然后往上找父類執(zhí)行相同操作
然后把所有符合條件的字段放到一個Field數(shù)組里面,先放基本數(shù)據(jù)類型,再放引用數(shù)據(jù)類型
最后把字段放入對應(yīng)類型的序列化器中去
得到一個FieldSerializer序列化器數(shù)組
我們還是繼續(xù)看writeObject方法
主要是第二張圖的3個方法,做的事情大概就是循環(huán)序列化field的名和值
下面再來看看反序列化:
構(gòu)造方法:
這里大概做了3個事
獲取fieldMap,方法如下:
獲取readResolve方法
獲取所有構(gòu)造器
遍歷構(gòu)造器數(shù)組找到cost最小的最佳構(gòu)造器
然后用最佳構(gòu)造器進行構(gòu)造,方法如下:
先看構(gòu)造器方法,基本數(shù)據(jù)類型的話返回包裝類型,引用數(shù)據(jù)類型返回null
主要我們來看獲取fieldMap的時候。和序列化時相同,先取子類再取父類,本來以為到這就結(jié)束了,可是看到了一行校驗
fieldMap.get(field.getName()) == null
如果父類的字段名和子類字段名相同,會跳過該循環(huán),也就是說只會有子類的值,那為什么還會覆蓋?
看最后一個readMap方法:
debug發(fā)現(xiàn)值被覆蓋就是在這里操作的
deser.deserialize(in, obj);
子類set過值以后,父類過來也會拿到子類的反序列化器,把子類的值覆蓋掉。
最后,那為什么會到readMap這一步呢?
debug發(fā)現(xiàn)SerializerFactory拿到反序列化器后會執(zhí)行一個readMap操作
基本上就到這里了,最主要的原因還是readMap方法,并不是很多博文說的fieldMap。如果哪里有不對的地方歡迎指出、討論以便及時修改。
參考文檔:鏈接描述
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/76565.html
摘要:使用的序列化是的,而對于類的反序列化的源碼如下這里我們可以清楚地看出來,將讀取到的轉(zhuǎn)為然后調(diào)用了方法,那么如果我們的屬性為空,那么調(diào)用函數(shù)必然會拋異常,也就產(chǎn)生了之后的結(jié)果。補充說明我找到的源碼可以看出,對于,,的反序列化均有問題存在。 背景 這是我之前提的問題:問題鏈接 在使用dubbo 2.5.3的時候,定義的接口中有一個方法使用了實體類作為參數(shù),而這個實體類中定義了一個變量為ja...
摘要:大揭秘目標了解的新特性,以及版本升級的引導。四元數(shù)據(jù)改造我們知道以前的版本只有注冊中心,注冊中心的有數(shù)十個的鍵值對,包含了一個服務(wù)所有的元數(shù)據(jù)。 DUBBO——2.7大揭秘 目標:了解2.7的新特性,以及版本升級的引導。 前言 我們知道Dubbo在2011年開源,停止更新了一段時間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發(fā)布了 2.5.4 版本。隨后,版本...
摘要:當提供程序線程池耗盡時,不能發(fā)送到使用者端。一些錯誤修正動態(tài)配置不能刪除,支持參數(shù),監(jiān)控統(tǒng)計問題等新功能支持手冊線程池耗盡時自動堆棧轉(zhuǎn)儲。在注冊表無法連接時被阻止。正常關(guān)機,在注冊表取消注冊和線程池關(guān)閉之間增加額外的等待時間。 dubbo分析showImg(https://segmentfault.com/img/bVbam2f?w=1726&h=686); dubbo為什么要對接sp...
摘要:前言到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。自己做出了一件很棒的事情完全可以拿去和別人炫耀,比如你用了一個很好的設(shè)計模式,比如你優(yōu)化了一個功能讓他快了倍,比如你開發(fā)了一個很棒的工具。 前言 到今天為止,正好是工作一年了。一年里有過折磨痛苦,有過成就感,一年后很欣慰能看到自己是有所收獲的。記錄如下,如有不當,還望指點。 技術(shù) 看...
摘要:英文全名為,也叫遠程過程調(diào)用,其實就是一個計算機通信協(xié)議,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù)而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。 Hello,Dubbo 你好,dubbo,初次見面,我想和你交個朋友。 Dubbo你到底是什么? 先給出一套官方的說法:Apache Dubbo是一款高性能、輕量級基于Java的RPC開源框架。 那么什么是RPC? 文檔地址:http://dubbo.a...
閱讀 2310·2021-11-22 12:01
閱讀 1983·2021-11-12 10:34
閱讀 4509·2021-09-22 15:47
閱讀 2827·2019-08-30 15:56
閱讀 2861·2019-08-30 15:53
閱讀 2398·2019-08-30 13:53
閱讀 3371·2019-08-29 15:35
閱讀 3119·2019-08-29 12:27