netty 编解码器,netty 编解码

  netty 编解码器,netty 编解码

  00-1010 XML frame decoder简介XmlDecoder摘要

  00-1010在json之前,xml是最常用的数据传输格式。虽然xml中的冗余数据多了一点,但是xml的结构简单明了,在程序中的不同地方还是会用到,自然为netty提供了对xml数据的支持。

  Netty在两个方面支持xml。第一个方面是将多个编码的xml数据拆分成帧,每个帧包含一个完整的xml。另一方面,在分割的帧上执行xml的语义分析。

  XmlFrameDecoder可用于拆分帧,XmlDecoder可用于解析xml文件的内容。接下来,我们将详细解释这两个解码器的实现和使用。

  00-1010因为我们正在接收数据流,所以我们不确定接收到的数据是什么样的。一个普通xml数据可以被分成多个数据帧。

  :如下图所示

  - - this IsA XMLElement/ - -

  这是一个普通的xml数据,但是它被分成三个帧,所以我们需要将它们合并成一个帧,如下所示:

  - thisisaxmlement/-

  也可能出现不同的xml数据被拆分成多个帧的情况,如下所示:

  -- an Xml Element/ ro otchildcontent/child/root ---

  上述数据需要分成两帧:

  - anxml element/ root child content/child/root --

  拆分的逻辑很简单,主要是通过确定xml的分隔符的位置来决定xml是开始还是结束。xml中有三个分隔符,分别是、和/。

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

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

  private static boolean isValidStartCharForXmlElement(最终字节b){ return b= A b= Z b= A b= Z b== : b== _ ;}是评论3360吗?

  private static boolean isCommentBlockStart(final byte buf in,final int I){ return I in . writer index()-3 in . get byte(I 2)=- in . get byte(I 3)=-;}是CDATA数据吗:

  private static boolean isCDATABlockStart(final byte buf in,final int I){ return I in . writer index()-8 in . get byte(I 2)==[ in . get byte(I 3)== C in . get byte(I 4)== D in . get byte(I 5)= A in . get byte(I 6)= T in . get byte(I 7)== A in . get byte(I 8)=[;使用这些方法判断xml数据的起始位置后,可以调用extractFrame方法从原始数据中复制要使用的ByteBuf,最后放入out:

  final byte buf frame=extract frame(in,reader index leadingwhitespace count,xmlelement length-leadingwhitespace count);in . skip bytes(XML element length);out.add(帧);

  

目录

将xml数据拆分成帧后,下一步就是分析xml中的具体数据。

 

  Netty提供了一个名为XmlDecoder的xml数据解析方法,主要用于解析一帧已经是单独的xml数据的本质。其定义如下:

  类xml decoder extends bytemessagecoder xml decoder根据读取的XML内容将XML拆分为xmlelementstart、xmlattribute、xmlnamespace、xmlelementend。Xmlprocessing指令、xmlcharacters、xmlcomment、xmlspace、xmldocument start、xmlentityreference、xmldtd和XmlCdata。

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

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

  但是,XmlDecoder借用了第三方xml工具包:Fasterxml来读取和解析xml。

  XmlDecoder使用fasterxml中的AsyncxmlStreamReader和AsyncByteArrayFeeder来解析xml数据。

  这两个属性定义如下:

  private static final AsyncXMLInputFactory XML _ INPUT _ FACTORY=new InputFactoryImpl();私有final asyncxmlstreamreaderasynccbytearrayfeeder streamReader;private final AsyncByteArrayFeeder stream feeder;this . streamreader=XML _ INPUT _ factory . createasyncforbytearray();this . stream feeder=(AsyncByteArrayFeeder)this . streamreader . getinputfeeder();decode的逻辑是通过判断xml元素的类型来读取不同的数据,最后将读取的数据封装成上面提到的各种xml对象,最后将xml对象添加到out列表中并返回。

  00-1010我们可以使用XmlFrameDecoder和XmlDecoder来实现非常方便的xml数据解析。netty已经为我们制造了一个轮子,所以我们不再需要自己发明它了。

  这就是这篇关于netty中常用的xml编解码器的文章。有关netty编解码器的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: