为什么通过Thrift发送时java.nio.ByteBuffer会发生变化?

我正在编写一个Thrift api,其中的请求包含Scala中的二进制数据。

合同是这样的:

struct Request {
  10: required string name
  20: required binary data
  30: required string type
}

发送之前客户端中的ByteBuffer对象是这样的:

java.nio.HeapByteBufferR[pos=0 lim=4 cap=4]

但是,服务器收到的ByteBuffer对象是不同的:

java.nio.HeapByteBuffer[pos=230 lim=234 cap=312]

我的问题是为什么会这样?以及什么是不意外更改ByteBuffer的最佳实践?