技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> Thrift Message deserialize 方法的一个缺点及改进

Thrift Message deserialize 方法的一个缺点及改进

浏览:2809次  出处信息

今天在写code时,要调用thrift的TDeserializer.deserialize()方法,发现其提供的接口很不好用。会导致应用代码的多一次copy。

thrift源码如下:

以下是代码片段:
 public void deserialize(TBase base, byte[] bytes) throws TException {
    base.read(
        protocolFactory_.getProtocol(
          new TIOStreamTransport(
            new ByteArrayInputStream(bytes))));
  }

可以看出,这里只可以传如byte[].

在应用程序中, 如果采用buffer复用,就会要导致buffer的不定长,这样的话,要调用此函数就要求一个中间的copy过程,(由于java中并无array的slice,据我所知效率最高的数组copy是System.arrayCopy(),调用native方法),导致浪费空间和时间。

解决方法是, 添加此方法,但需编译thrift.jar

以下是代码片段:
 public void deserialize(TBase base, byte[] bytes, int offset, int len) throws TException {
    base.read(
        protocolFactory_.getProtocol(
          new TIOStreamTransport(
            new ByteArrayInputStream(bytes, offfset, len))));
  }

 这样的话就可以实现应用层的buffer复用,而且实现反序列化的zero-copy.

建议继续学习:

  1. Linux大棚版Thrift入门教程    (阅读:23645)
  2. HBase Thrift 接口使用注意事项    (阅读:5459)
  3. Thrift简析    (阅读:4868)
  4. Apache Avro 与 Thrift 比较    (阅读:4590)
  5. php实现的thrift socket server    (阅读:3700)
  6. 初探Thrift客户端异步模式    (阅读:1267)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1