




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第詳解netty中常用的xml編碼解碼器目錄簡介XmlFrameDecoderXmlDecoder總結(jié)
簡介
在json之前,xml是最常用的數(shù)據(jù)傳輸格式,雖然xml的冗余數(shù)據(jù)有點(diǎn)多,但是xml的結(jié)構(gòu)簡單清晰,至今仍然運(yùn)用在程序中的不同地方,對于netty來說自然也提供了對于xml數(shù)據(jù)的支持。
netty對xml的支持表現(xiàn)在兩個(gè)方面,第一個(gè)方面是將編碼過后的多個(gè)xml數(shù)據(jù)進(jìn)行frame拆分,每個(gè)frame包含一個(gè)完整的xml。另一方面是將分割好的frame進(jìn)行xml的語義解析。
進(jìn)行frame拆分可以使用XmlFrameDecoder,進(jìn)行xml文件內(nèi)容的解析則可以使用XmlDecoder,接下來我們會詳細(xì)講解兩個(gè)decoder實(shí)現(xiàn)和使用。
XmlFrameDecoder
因?yàn)槲覀兪盏降氖菙?shù)據(jù)流,所以不確定收到的數(shù)據(jù)到底是什么樣的,一個(gè)正常的xml數(shù)據(jù)可能會被拆分成多個(gè)數(shù)據(jù)frame。
如下所示:
+-------+-----+--------------+
|this|IsA|XMLElement/|
+-------+-----+--------------+
這是一個(gè)正常的xml數(shù)據(jù),但是被拆分成為了三個(gè)frame,所以我們需要將其合并成為一個(gè)frame如下:
+-----------------+
|thisIsAXMLElement/|
+-----------------+
還有可能不同的xml數(shù)據(jù)被分拆在多個(gè)frame中的情況,如下所示:
+-----+-----+-----------+-----+----------------------------------+
|an|Xml|Element/|ro|otchildcontent/child/root|
+-----+-----+-----------+-----+----------------------------------+
上面的數(shù)據(jù)需要拆分成為兩個(gè)frame:
+-----------------+-------------------------------------+
|anXmlElement/|rootchildcontent/child/root|
+-----------------+-------------------------------------+
拆分的邏輯很簡單,主要是通過判斷xml的分隔符的位置來判斷xml是否開始或者結(jié)束。xml中的分隔符有三個(gè),分別是,和/。
在decode方法中只需要判斷這三個(gè)分隔符即可。
另外還有一些額外的判斷邏輯,比如是否是有效的xml開始字符:
privatestaticbooleanisValidStartCharForXmlElement(finalbyteb){
returnb='a'b='z'||b='A'b='Z'||b==':'||b=='_';
}
是否是注釋:
privatestaticbooleanisCommentBlockStart(finalByteBufin,finalinti){
returniin.writerIndex()-3
in.getByte(i+2)=='-'
in.getByte(i+3)=='-';
}
是否是CDATA數(shù)據(jù):
privatestaticbooleanisCDATABlockStart(finalByteBufin,finalinti){
returniin.writerIndex()-8
in.getByte(i+2)=='['
in.getByte(i+3)=='C'
in.getByte(i+4)=='D'
in.getByte(i+5)=='A'
in.getByte(i+6)=='T'
in.getByte(i+7)=='A'
in.getByte(i+8)=='[';
通過使用這些方法判斷好xml數(shù)據(jù)的起始位置之后,就可以調(diào)用extractFrame方法將要使用的ByteBuf從原始數(shù)據(jù)中拷貝出來,最后放到out中去:
finalByteBufframe=
extractFrame(in,readerIndex+leadingWhiteSpaceCount,xmlElementLength-leadingWhiteSpaceCount);
in.skipBytes(xmlElementLength);
out.add(frame);
XmlDecoder
將xml數(shù)據(jù)拆分成為一個(gè)個(gè)frame之后,接下來就是對xml中具體數(shù)據(jù)的解析了。
netty提供了一個(gè)xml數(shù)據(jù)解析的方法叫做XmlDecoder,主要用來對已經(jīng)是一個(gè)單獨(dú)的xml數(shù)據(jù)的frame進(jìn)行實(shí)質(zhì)內(nèi)容的解析,它的定義如下:
publicclassXmlDecoderextendsByteToMessageDecoder
XmlDecoder根據(jù)讀取到的xml內(nèi)容,將xml的部分拆分為XmlElementStart,XmlAttribute,XmlNamespace,XmlElementEnd,XmlProcessingInstruction,XmlCharacters,XmlComment,XmlSpace,XmlDocumentStart,XmlEntityReference,XmlDTD和XmlCdata。
這些數(shù)據(jù)基本上覆蓋了xml中所有可能出現(xiàn)的元素。
所有的這些元素都是定義在ty.handler.codec.xml包中的。
但是XmlDecoder對xml的讀取解析則是借用了第三方xml工具包:fasterxml。
XmlDecoder使用了fasterxml中的AsyncXMLStreamReader和AsyncByteArrayFeeder用來進(jìn)行xml數(shù)據(jù)的解析。
這兩個(gè)屬性的定義如下:
privatestaticfinalAsyncXMLInputFactoryXML_INPUT_FACTORY=newInputFactoryImpl();
privatefinalAsyncXMLStreamReaderAsyncByteArrayFeederstreamReader;
privatefinalAsyncByteArrayFeederstreamFeeder;
this.streamReader=XML_INPUT_FACTORY.createAsyncForByteArray();
this.streamFeeder=(AsyncByteArrayFeeder)this.streamReader.getInputFeeder();
decode的邏輯是通過判斷
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全保衛(wèi)管理專業(yè)試題及答案
- 安全操作試題及答案
- 探索數(shù)字教育資源的多元應(yīng)用場景
- 2025年鋼制S型散熱器項(xiàng)目市場調(diào)查研究報(bào)告
- 2025年金沙晶手鏈項(xiàng)目市場調(diào)查研究報(bào)告
- 2025年金剛石拋光液項(xiàng)目市場調(diào)查研究報(bào)告
- 2025年酸性紅B項(xiàng)目市場調(diào)查研究報(bào)告
- 2025年造粒機(jī)項(xiàng)目市場調(diào)查研究報(bào)告
- 2025年適樂時(shí)2.5%懸浮種衣劑項(xiàng)目市場調(diào)查研究報(bào)告
- 商業(yè)環(huán)境下的數(shù)字孿生技術(shù)應(yīng)用及前景
- 太原日用陶瓷項(xiàng)目商業(yè)計(jì)劃書范文
- 薪酬福利體系優(yōu)化方案
- SA8000-社會責(zé)任程序文件(完整版)
- 2025年社區(qū)工作者招聘考試試題及答案清單
- 單細(xì)胞測序:解鎖妊娠相關(guān)疾病細(xì)胞與分子特征的新鑰匙
- 裝飾工程掛靠協(xié)議書
- 山東省濟(jì)南市2025屆高三三模地理試卷(含答案)
- 部編人教版小學(xué)4四年級《道德與法治》下冊全冊教案
- 07FJ02防空地下室建筑構(gòu)造
- 中考數(shù)學(xué)計(jì)算題練習(xí)100道(2024年中考真題)
- MOOC 光學(xué)發(fā)展與人類文明-華南師范大學(xué) 中國大學(xué)慕課答案
評論
0/150
提交評論