下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第详解netty中常用的xml编码解码器目录简介XmlFrameDecoderXmlDecoder总结
简介
在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的不同地方,对于netty来说自然也提供了对于xml数据的支持。
netty对xml的支持表现在两个方面,第一个方面是将编码过后的多个xml数据进行frame拆分,每个frame包含一个完整的xml。另一方面是将分割好的frame进行xml的语义解析。
进行frame拆分可以使用XmlFrameDecoder,进行xml文件内容的解析则可以使用XmlDecoder,接下来我们会详细讲解两个decoder实现和使用。
XmlFrameDecoder
因为我们收到的是数据流,所以不确定收到的数据到底是什么样的,一个正常的xml数据可能会被拆分成多个数据frame。
如下所示:
+-------+-----+--------------+
|this|IsA|XMLElement/|
+-------+-----+--------------+
这是一个正常的xml数据,但是被拆分成为了三个frame,所以我们需要将其合并成为一个frame如下:
+-----------------+
|thisIsAXMLElement/|
+-----------------+
还有可能不同的xml数据被分拆在多个frame中的情况,如下所示:
+-----+-----+-----------+-----+----------------------------------+
|an|Xml|Element/|ro|otchildcontent/child/root|
+-----+-----+-----------+-----+----------------------------------+
上面的数据需要拆分成为两个frame:
+-----------------+-------------------------------------+
|anXmlElement/|rootchildcontent/child/root|
+-----------------+-------------------------------------+
拆分的逻辑很简单,主要是通过判断xml的分隔符的位置来判断xml是否开始或者结束。xml中的分隔符有三个,分别是,和/。
在decode方法中只需要判断这三个分隔符即可。
另外还有一些额外的判断逻辑,比如是否是有效的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数据:
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数据的起始位置之后,就可以调用extractFrame方法将要使用的ByteBuf从原始数据中拷贝出来,最后放到out中去:
finalByteBufframe=
extractFrame(in,readerIndex+leadingWhiteSpaceCount,xmlElementLength-leadingWhiteSpaceCount);
in.skipBytes(xmlElementLength);
out.add(frame);
XmlDecoder
将xml数据拆分成为一个个frame之后,接下来就是对xml中具体数据的解析了。
netty提供了一个xml数据解析的方法叫做XmlDecoder,主要用来对已经是一个单独的xml数据的frame进行实质内容的解析,它的定义如下:
publicclassXmlDecoderextendsByteToMessageDecoder
XmlDecoder根据读取到的xml内容,将xml的部分拆分为XmlElementStart,XmlAttribute,XmlNamespace,XmlElementEnd,XmlProcessingInstruction,XmlCharacters,XmlComment,XmlSpace,XmlDocumentStart,XmlEntityReference,XmlDTD和XmlCdata。
这些数据基本上覆盖了xml中所有可能出现的元素。
所有的这些元素都是定义在ty.handler.codec.xml包中的。
但是XmlDecoder对xml的读取解析则是借用了第三方xml工具包:fasterxml。
XmlDecoder使用了fasterxml中的AsyncXMLStreamReader和AsyncByteArrayFeeder用来进行xml数据的解析。
这两个属性的定义如下:
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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 齿轮加工自动化技术二期改造升级项目可行性研究报告模板立项申批备案
- 2026年“少年儿童心向党我与祖国共成长”六一国际儿童节主题活动方案
- 2025-2030年无人机海洋垃圾清理方案行业深度调研及发展战略咨询报告
- 移动通信终端设备及零部件创新创业项目商业计划书
- 2025-2030年虚拟银行跨境支付与外汇兑换企业制定与实施新质生产力战略分析研究报告
- 全球矿产资源供需格局与战略性矿产投资逻辑
- 2026年版网站建设服务合同含维护条款
- 中国游戏行业市场格局与投资逻辑深度分析
- 湖南学考地理试卷及答案
- 铜的供需格局与能源转型驱动
- 幼儿园兴趣班合作协议书范本
- 【MOOC】跨文化交际入门-华中师范大学 中国大学慕课MOOC答案
- 《预应力管桩》课件
- 2023内蒙古呼伦贝尔市根河市“一社区一名大学生”引进拟聘用人员进行笔试历年典型考题及考点剖析附答案带详解
- GB/T 1243-2024传动用短节距精密滚子链、套筒链、附件和链轮
- 中国绝经管理与绝经激素治疗指南(2023版)解读
- 百年商埠-梧州课件
- 中国红肠行业市场前景分析报告
- 工业设计方法学
- 医用氧气使用检查记录表
- 知识创新与学术规范中国大学mooc课后章节答案期末考试题库2023年
评论
0/150
提交评论