当前位置: 首页 > 后端技术 > Java

Netty系列:xml编解码介绍

时间:2023-04-01 21:30:41 Java

netty常用在json之前,xml是最常用的数据传输格式。虽然xml有很多冗余数据,但是xml的结构简单明了,在程序中还是用在不同的地方,netty自然也提供了对xml数据的支持。Netty对xml的支持表现在两个方面。第一个方面是将编码后的xml数据拆分成帧,每个帧包含一个完整的xml。另一方面,对分割后的框架进行xml的语义分析。您可以使用XmlFrameDecoder进行帧拆分,使用XmlDecoder来解析xml文件的内容。接下来,我们将详细解释这两个解码器的实现和使用。XmlFrameDecoder不确定收到的数据是什么样的,因为我们收到的是数据流。一个普通的xml数据可能会被拆分成多个数据框。如下:+--------+-----+------------+|<这个|是A|XML元素/>|+-------+-----+------------+这是一个普通的xml数据,但是被拆分成了三帧,所以我们需要合并intoone框架如下:+----------------+||+----------------+有可能不同的xml数据拆分成多个frame,如下图:+-----+-----+------------+-----+----------------------------------+|<一个|XML|元素/>|<罗|ot>内容|+-----+-----+------------+-----+------------------------------+以上数据需要拆分成两帧:+------------------+--------------------------------------+||内容|+----------------+---------------------------------+拆分的逻辑很简单,主要是通过判断xml定界符的位置来判断xml是开始还是结束。xml中有'<'、'>'和'/'三种分隔符。在decode方法中只需要判断这三个分隔符即可。另外还有一些额外的判断逻辑,比如是否是有效的xml起始符:privatestaticbooleanisValidStartCharForXmlElement(finalbyteb){returnb>='a'&&b<='z'||b>='A'&&b<='Z'||b==':'||b=='_';}是注释吗:privatestaticbooleanisCommentBlockStart(finalByteBufin,finalinti){returnistreamReader;私有最终AsyncByteArrayFeederstreamFeeder;this.streamReader=XML_INPUT_FACTORY.createAsyncForByteArray();this.streamFeeder=(AsyncByteArrayFeeder)this.streamReader.getInputFeeder();解码的逻辑是通过判断xml元素的类型,分别读取不同的数据,最后将读取到的数据封装成我们上面提到的各种xml对象,最后将xml对象返回到out列表中。综上所述,我们可以使用XmlFrameDecoder和XmlDecoder来实现非常方便的xml数据解析。Netty已经为我们造好了轮子,所以我们不需要自己去发明。本文已收录于http://www.flydean.com/14-7-netty-codec-xml/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!