千家信息网

netty中常用的xml编码解码器怎么用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"netty中常用的xml编码解码器怎么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"netty中常用的xml编码解码器怎么用"吧
千家信息网最后更新 2026年10月31日netty中常用的xml编码解码器怎么用

这篇文章主要讲解了"netty中常用的xml编码解码器怎么用",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"netty中常用的xml编码解码器怎么用"吧!

简介

在json之前,xml是最常用的数据传输格式,虽然xml的冗余数据有点多,但是xml的结构简单清晰,至今仍然运用在程序中的不同地方,对于netty来说自然也提供了对于xml数据的支持。

netty对xml的支持表现在两个方面,第一个方面是将编码过后的多个xml数据进行frame拆分,每个frame包含一个完整的xml。另一方面是将分割好的frame进行xml的语义解析。

进行frame拆分可以使用XmlFrameDecoder,进行xml文件内容的解析则可以使用XmlDecoder,接下来我们会详细讲解两个decoder实现和使用。

XmlFrameDecoder

因为我们收到的是数据流,所以不确定收到的数据到底是什么样的,一个正常的xml数据可能会被拆分成多个数据frame。

如下所示:

+-------+-----+--------------+
| |
+-------+-----+--------------+

这是一个正常的xml数据,但是被拆分成为了三个frame,所以我们需要将其合并成为一个frame如下:

+-----------------+
| |
+-----------------+

还有可能不同的xml数据被分拆在多个frame中的情况,如下所示:

+-----+-----+-----------+-----+----------------------------------+
| | content |
+-----+-----+-----------+-----+----------------------------------+

上面的数据需要拆分成为两个frame:

+-----------------+-------------------------------------+
| | content |
+-----------------+-------------------------------------+

拆分的逻辑很简单,主要是通过判断xml的分隔符的位置来判断xml是否开始或者结束。xml中的分隔符有三个,分别是’<', ‘>’ 和 ‘/’。

在decode方法中只需要判断这三个分隔符即可。

另外还有一些额外的判断逻辑,比如是否是有效的xml开始字符:

 private static boolean isValidStartCharForXmlElement(final byte b) {        return b >= 'a' && b <= 'z' || b >= 'A' && b <= 'Z' || b == ':' || b == '_';    }

是否是注释:

  private static boolean isCommentBlockStart(final ByteBuf in, final int i) {        return i < in.writerIndex() - 3                && in.getByte(i + 2) == '-'                && in.getByte(i + 3) == '-';    }

是否是CDATA数据:

 private static boolean isCDATABlockStart(final ByteBuf in, final int i) {        return i < in.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中去:

final ByteBuf frame =                    extractFrame(in, readerIndex + leadingWhiteSpaceCount, xmlElementLength - leadingWhiteSpaceCount);            in.skipBytes(xmlElementLength);            out.add(frame);

XmlDecoder

将xml数据拆分成为一个个frame之后,接下来就是对xml中具体数据的解析了。

netty提供了一个xml数据解析的方法叫做XmlDecoder,主要用来对已经是一个单独的xml数据的frame进行实质内容的解析,它的定义如下:

public class XmlDecoder extends ByteToMessageDecoder

XmlDecoder根据读取到的xml内容,将xml的部分拆分为XmlElementStart,XmlAttribute,XmlNamespace,XmlElementEnd,XmlProcessingInstruction,XmlCharacters,XmlComment,XmlSpace,XmlDocumentStart,XmlEntityReference,XmlDTD和XmlCdata。

这些数据基本上覆盖了xml中所有可能出现的元素。

所有的这些元素都是定义在io.netty.handler.codec.xml包中的。

但是XmlDecoder对xml的读取解析则是借用了第三方xml工具包:fasterxml。

XmlDecoder使用了fasterxml中的AsyncXMLStreamReader和AsyncByteArrayFeeder用来进行xml数据的解析。

这两个属性的定义如下:

 private static final AsyncXMLInputFactory XML_INPUT_FACTORY = new InputFactoryImpl();    private final AsyncXMLStreamReader streamReader;    private final AsyncByteArrayFeeder streamFeeder;            this.streamReader = XML_INPUT_FACTORY.createAsyncForByteArray();        this.streamFeeder = (AsyncByteArrayFeeder)this.streamReader.getInputFeeder();

decode的逻辑是通过判断xml element的类型来分别进行不同数据的读取,最后将读取到的数据封装成上面我们提到的各种xml对象,最后将xml对象添加到out list中返回。

感谢各位的阅读,以上就是"netty中常用的xml编码解码器怎么用"的内容了,经过本文的学习后,相信大家对netty中常用的xml编码解码器怎么用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

数据 常用 编码 内容 解码器 两个 方法 不同 三个 分隔符 多个 逻辑 学习 接下来 位置 元素 对象 就是 情况 方面 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 互联网品科技 盈实互联网科技 互联网 科技 易互联网科技有限公司 奇士达互联网科技 互联网科技ppt模板 互联网科技公司需要的职位 深圳前海聚择互联网科技有限公司 互联网科技研发水平 洛阳共同富裕互联网科技有限公司 互联网科技创新的路径 济南有互联网科技公司吗 科技互联网海报 沐思想互联网科技有限公司 互联网公司高科技产品 产业互联网科技服务公司 半导体行业属于互联网高科技类吗 互联网科技和医药行业 互联网科技品牌 广东万易互联网科技有限公司惠州分公司 厦门中拓互联网络科技有限公司 小米互联网科技园设置 浙南科技城互联网大厦招聘 本届互联网大会上的黑科技 互联网科技企业商标注意事项 中国科技和美国互联网 北京军民互联网科技公司 互联网科技和医药行业 北京瑞云互联网科技有限公司
0