code: public ByteBuffer[] toByteBuffers() {
          if (LOG.isDebugEnabled())
              LOG.debug("to bb type " + type.name());
          final ByteBuffer buffer0 = ByteBuffer.allocate(size1() + 2 * getNumDataBuffers());
          Persistables.persistable(streamableNoBuffers()).write(buffer0);
          for (int i = 0; i < getNumDataBuffers(); i++)
              buffer0.putShort(getDataBuffer(i) != null ? verifyShort(getDataBuffer(i).remaining()) : 0);
          buffer0.flip();
  
          final ByteBuffer[] buffers = new ByteBuffer[1 + getNumDataBuffers()];
          buffers[0] = buffer0;
          for (int i = 0; i < getNumDataBuffers(); i++)
              buffers[1 + i] = getDataBuffer(i);
          return buffers;
      }
docs: The contract is: the first buffer is new. Comm can do whatever with it. The rest of the buffers point to cache buffers, so if they're not handled during the send() call (i.e. if they're queued
  and handled later), then they must be copied. <br/> Note that this returns a different representation from toByteArray!
  
  @return