为什么java.nio.ByteBuffer在通过Thrift发送时会发生更改?

为什么java.nio.ByteBuffer在通过Thrift发送时会发生更改?,java,scala,thrift,bytebuffer,Java,Scala,Thrift,Bytebuffer,我正在编写一个Thrift api,请求包含Scala中的二进制数据 合同是这样的: struct Request { 10: required string name 20: required binary data 30: required string type } java.nio.HeapByteBufferR[pos=0 lim=4 cap=4] 发送前客户端中的ByteBuffer对象如下所示: struct Request { 10: required str

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

合同是这样的:

struct Request {
  10: required string name
  20: required binary data
  30: required string type
}
java.nio.HeapByteBufferR[pos=0 lim=4 cap=4]
发送前客户端中的ByteBuffer对象如下所示:

struct Request {
  10: required string name
  20: required binary data
  30: required string type
}
java.nio.HeapByteBufferR[pos=0 lim=4 cap=4]
但是,服务器接收的ByteBuffer对象不同:

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

我的问题是为什么会发生这种情况?什么是避免意外更改ByteBuffer的最佳实践?

这是因为服务器端的ByteBuffer将包装请求的所有信息,并将pos和限制设置为包含二进制数据的分区。因此,要仅获取二进制数据部分,只需使用ByteBuffer的切片方法。

服务器接收的缓冲区是否应该是您的缓冲区,并且仅是您的缓冲区?因为服务器端的缓冲区有一个pos=230和lim=234,这意味着它有4个字节可以读取,这似乎与客户端缓冲区相匹配。服务器端缓冲区可能包含其他信息,例如协议头,并且只是定位为读取您发送的数据,并且仅读取该数据。请注意,如果您提供帮助,它可能会帮助其他人。