IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

淘宝数据平台团队 2010-10-18 08:12:09 累计浏览 3,983 次
本机暂存

今天在写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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. SmartSprites - 命令行形式的CSS Sprites生成器 (累计阅读 123,894)
  2. Linux大棚版Thrift入门教程 (累计阅读 24,505)
  3. Java开发岗位面试题归类汇总 (累计阅读 22,155)
  4. android 开发入门 (累计阅读 19,527)
  5. 记录一个软中断问题 (累计阅读 16,954)
  6. Go Reflect 性能 (累计阅读 14,155)
  7. 我的PHP,Python和Ruby之路 (累计阅读 13,146)
  8. HashMap解决hash冲突的方法 (累计阅读 12,652)
  9. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,178)
  10. 分布式日志系统scribe使用手记 (累计阅读 8,978)